Ответ
В C++ существует несколько видов наследования, определяемых спецификатором доступа:
-
Публичное наследование (
public) Члены базового класса сохраняют свой исходный уровень доступа в производном классе. Это классический способ реализации отношения "является" (is-a).class Base { public: int publicMember; protected: int protectedMember; }; class Derived : public Base { // publicMember остаётся public // protectedMember остаётся protected }; -
Защищённое наследование (
protected) Всеpublicиprotectedчлены базового класса становятсяprotectedв производном классе. Это редко используется, но может быть полезно для создания промежуточных классов в иерархии.class Derived : protected Base { // publicMember становится protected // protectedMember остаётся protected }; -
Приватное наследование (
private) Все члены базового класса становятсяprivateв производном классе. Это реализация отношения "реализован посредством" (implemented-in-terms-of) и является способом композиции. Дляclassэто значение по умолчанию.class Derived : private Base { // publicMember становится private // protectedMember становится private }; -
Виртуальное наследование (
virtual) Решает проблему ромбовидного наследования, гарантируя, что в производном классе существует только один экземпляр виртуального базового класса, даже если он наследуется по нескольким путям.class A { public: int data; }; class B : virtual public A {}; class C : virtual public A {}; class D : public B, public C { // В D только один экземпляр A::data, нет неоднозначности };
C++ также поддерживает множественное наследование — класс может наследовать от нескольких базовых классов одновременно. Виртуальное наследование часто применяется именно в этом контексте для устранения дублирования.