#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 члены базового класса будут вполне доступны, как приватные члены в производном классе.
Комментариев нет:
Отправить комментарий