В С++ 11 было введено ключевое слово final
, чтобы запретить будущие переопределения или запретить наследование. Наиболее распространенный пример, где он может использоваться, относится к классам, которые не предназначены для использования в качестве базовых классов (например, не виртуальных деструкторов). Тем не менее, иногда мы можем захотеть иметь отношение is-реализованное-в-термины между двумя классами (т.е. private
inheritance), а не is-a отношение (public
наследование). Однако final
запрещает оба типа наследования.
Мой вопрос заключается в следующем: существует ли способ разрешить наследование private
, но запрещает наследование public
(возможно, не напрямую, но по крайней мере мы можем "имитировать" его)? В этом случае проблем не будет, даже если мы будем использовать класс с не виртуальным деструктором, так как мы не можем напрямую использовать производный класс с помощью указателя на базу, поэтому мы должны быть в порядке.
Я думаю о таком коде:
class Base /*final*/ {}; // making it final prohibits both private and public inheritance
class PrivateDerived: private Base{}; // this should work
class PublicDerived: public Base{}; // this shouldn't
int main()
{
PrivateDerived prvd;
PublicDerived pubd; // this should not compile
// Base* pBase = new PrivateDerived; // doesn't work, so we are ok
}