Наследование и полиморфизм
Строим семейства классов, повторно используем код и заставляем один вызов делать многое
- создать базовый и производный класс с помощью
: public Base, - повторно использовать и расширять унаследованные члены, применять
protected, - вызывать конструктор базового класса из производного,
- использовать
virtual-функции иoverrideдля полиморфизма, - объяснить, зачем базовому классу нужен
virtual-деструктор.
1. Что такое наследование?
Наследование позволяет одному классу (производному) автоматически получить члены другого класса (базового). Затем производный класс может добавить что-то своё. Записываем это через двоеточие и public:
#include <iostream>
using namespace std;
class Animal { // base class
public:
void eat() {
cout << "This animal eats food." << endl;
}
};
class Dog : public Animal { // derived class
public:
void bark() {
cout << "Woof!" << endl;
}
};
int main() {
Dog d;
d.eat(); // inherited from Animal
d.bark(); // Dog's own method
return 0;
}
Вывод:
This animal eats food.
Woof!
Dog не писал функцию eat(), но d.eat() работает, потому что Dog унаследовал её от Animal. Мы говорим «собака — это животное». Это отношение «является».
2. Представь семейство классов
У одного базового класса может быть много производных. Стрелка означает «наследует от» и всегда указывает от ребёнка вверх к родителю:
И Dog, и Cat получают всё публичное из Animal, поэтому общий код лежит в одном месте. Исправь ошибку в Animal один раз — и все производные классы тоже исправлены.