Страницы

Поиск по вопросам

четверг, 28 ноября 2019 г.

Private наследование

#c++ #ооп


Для чего нужно наследование с описателем доступа private, если все поля базового
класса станут недоступными?
    


Ответы

Ответ 1



Именно для того, чтобы все члены базового класса не были доступны снаружи (были доступны только изнутри класса, или друзьям класса). Наследование мало чем отличается от аггрегации, и class A : private B { ... }; аналогично class A { private: B b; };. Одна в отличие от private: B b;, при наследовании функции B можно вызывать как члены своего класса, т.е. не b.f(), а просто f(). Также можно унаследоваться от абстрактного класса, и переопределить его методы, не показывая все эти делати наружу, например: struct Callback { virtual void done() = 0; }; void run(Callback* b); class Cls : private Callback { public: void some() { run(this); } private: void done() override { ... } };

Ответ 2



Приватное наследование — это по существу композиция, выраженная немного по-другому. При композиции у вас вложенный объект доступен по своему имени, но не виден снаружи. При приватном наследовании вложенный объект «влит» в *this. Вообще, роль наследования — выражать отношение Is-A между классами. То есть, выражать наследование интерфейса, при этом наследование имплементации есть техническая деталь. А приватное наследование именно это и не может, при приватном наследовании наследуется именно имплементация, но не интерфейс. Поэтому практически всегда вместо приватного наследования стоит предпочесть именно композицию: она выражает ту же идею, но явно.

Ответ 3



При приватном наследовании public и protected члены базового класса будут вполне доступны, как приватные члены в производном классе.

Комментариев нет:

Отправить комментарий