Что такое наследование в ООП?

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

Ответ

Наследование — это механизм объектно-ориентированного программирования, позволяющий создавать новый класс (производный или дочерний) на основе существующего (базового или родительского). Производный класс наследует члены данных и методы базового класса, что способствует повторному использованию кода и построению иерархий.

Ключевые аспекты в C++:

  • Отношение «является» (is-a): Dog является Animal. Это основа для полиморфизма.
  • Типы наследования: определяют уровень доступа к унаследованным членам базового класса.
    • public: Открытые и защищённые члены базового класса остаются таковыми в производном.
    • protected: Открытые и защищённые члены базового класса становятся защищёнными в производном.
    • private: Открытые и защищённые члены базового класса становятся приватными в производном.
  • Конструкторы и деструкторы: Конструкторы базового класса вызываются перед конструкторами производного. Деструкторы вызываются в обратном порядке.

Пример:

#include <iostream>
using namespace std;

// Базовый класс
class Animal {
public:
    void eat() const {
        cout << "Animal is eating." << endl;
    }
protected:
    int age; // Доступен в производных классах
};

// Производный класс с публичным наследованием
class Dog : public Animal {
public:
    void bark() const {
        cout << "Dog is barking!" << endl;
    }
    void setAge(int a) { age = a; } // Можем использовать защищённый член
};

int main() {
    Dog myDog;
    myDog.eat();   // Унаследованный метод
    myDog.bark();  // Собственный метод
    myDog.setAge(5);
    // myDog.age = 5; // Ошибка: 'age' is protected within this context
    return 0;
}

Наследование — фундамент для полиморфизма, когда указатель или ссылка на базовый класс могут использоваться для вызова переопределённых методов в производных классах.