Наследование в C++
Базовый и производный класс
Наследование описывает отношение «является». Производный класс получает доступ к разрешённым членам базового класса и может расширить поведение.
class Entity {public: explicit Entity(int health) : health(health) {} int GetHealth() const { return health; }private: int health;};class Player : public Entity {public: Player() : Entity(100) {}};Player является Entity, поэтому public-интерфейс базового класса доступен через объект Player.
Виды наследования
При public-наследовании публичные члены базы остаются публичными, а protected остаются защищёнными. При protected и private-наследовании доступ меняется, поэтому такие варианты требуют конкретной причины. Для отношения «имеет» чаще подходит композиция.
protected
protected доступен базовому классу и его наследникам. Не превращай все поля в protected: это создаёт сильную связь между классами и позволяет производным типам нарушать внутренние правила базы.
Конструкторы и деструкторы
Сначала конструируется базовая часть, затем поля и тело производного класса. При уничтожении порядок обратный. Производный конструктор должен корректно инициализировать базовый класс в списке инициализации.
Когда наследование не подходит
Если два класса просто используют одинаковую функцию, это не обязательно повод для наследования. Подумай о свободной функции, композиции или общем небольшом компоненте.
Итог
Используй наследование для настоящего отношения «является» и стабильного общего интерфейса. Для повторного использования реализации без такого отношения предпочитай композицию.
