Какие виды наследования классов существуют в C++?

«Какие виды наследования классов существуют в C++?» — вопрос из категории ООП, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В C++ существует несколько видов наследования, определяемых спецификатором доступа:

  1. Публичное наследование (public) Члены базового класса сохраняют свой исходный уровень доступа в производном классе. Это классический способ реализации отношения "является" (is-a).

    class Base {
    public:
        int publicMember;
    protected:
        int protectedMember;
    };
    class Derived : public Base {
        // publicMember остаётся public
        // protectedMember остаётся protected
    };
  2. Защищённое наследование (protected) Все public и protected члены базового класса становятся protected в производном классе. Это редко используется, но может быть полезно для создания промежуточных классов в иерархии.

    class Derived : protected Base {
        // publicMember становится protected
        // protectedMember остаётся protected
    };
  3. Приватное наследование (private) Все члены базового класса становятся private в производном классе. Это реализация отношения "реализован посредством" (implemented-in-terms-of) и является способом композиции. Для class это значение по умолчанию.

    class Derived : private Base {
        // publicMember становится private
        // protectedMember становится private
    };
  4. Виртуальное наследование (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++ также поддерживает множественное наследование — класс может наследовать от нескольких базовых классов одновременно. Виртуальное наследование часто применяется именно в этом контексте для устранения дублирования.