Наследование и композиция: компромиссы
Сравнивайте наследование и композицию и выбирайте подходящий инструмент для проектирования.
«Наследование и композиция: компромиссы» — бесплатный урок C++ Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Два способа повторно использовать код
Вы можете повторно использовать код, наследуясь от другого класса или включая его в качестве члена. У каждого подхода есть своё место.
Наследование: «является»
Используйте наследование, когда производный класс действительно является особым видом базового класса.
class Vehicle {};
class Car : public Vehicle {}; // a Car IS a Vehicle
class SportsCar : public Car {};Композиция: «имеет»
Используйте композицию, когда отношение имеет вид «имеет» или «использует».
class Engine {};
class Car {
Engine engine_; // a Car HAS an Engine
};Компромисс между связанностью
Наследование создаёт тесную связанность: производные классы зависят от внутреннего устройства базового класса. Композиция сохраняет независимость модулей и упрощает их изменение.
Гибкость
Композиция позволяет менять поведение во время выполнения — можно заменить включённый объект. Наследование связывает поведение во время компиляции.
class Logger {
std::unique_ptr<LogSink> sink_; // can swap implementations
public:
void setSink(std::unique_ptr<LogSink> s) { sink_ = std::move(s); }
};Тестирование
Составные объекты можно заменять имитациями при тестировании. Базовые классы, от которых наследуются, сложнее имитировать без виртуальных функций или шаблонов.
Проблема хрупкого базового класса
Изменения в базовом классе могут нарушить работу многих производных классов. Композиция изолирует изменения в классе, который её использует.
Когда выбирать наследование
Наследование подходит, когда:
- существует чёткое отношение «является»
- нужен полиморфизм через интерфейс базового класса
- базовый класс явно спроектирован для наследования
Когда выбирать композицию
Композиция подходит, когда:
- Вы хотите иметь возможность заменять реализации
- отношение имеет вид «имеет» или «использует»
- Вы хотите уменьшить связанность и упростить тестирование
Паттерн «Стратегия»
Объединяйте композицию с полиморфизмом: храните указатель на базовый класс, указывающий на объект-стратегию, включённый в состав основного класса.
class Sorter {
std::unique_ptr<SortStrategy> strategy_;
public:
void sort(std::vector<int>& v) { strategy_->execute(v); }
};Примеси и классы политик
Для настройки во время компиляции используйте шаблонные классы политик — композицию на уровне типов. Это мощный подход без накладных расходов во время выполнения.
Интерфейс и композиция
Распространённый современный паттерн: определить интерфейс (абстрактный базовый класс) и включить в состав конкретные классы, которые его реализуют. Наследование используется для интерфейса, а композиция — для реализации.
Быстрая проверка
Какой подход обычно обеспечивает большую гибкость и меньшую связанность?
Итоги
Наследование моделирует отношение «является», а композиция — «имеет». Композиция гибче и создаёт меньшую связанность, поэтому предпочитайте её для повторного использования кода. Используйте наследование для полиморфизма через интерфейс, часто сочетая его с композициями конкретных реализаций.
Часто задаваемые вопросы
Урок «Наследование и композиция: компромиссы» бесплатный?
Да — полный текст урока «Наследование и композиция: компромиссы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «Наследование и композиция: компромиссы»?
Сравнивайте наследование и композицию и выбирайте подходящий инструмент для проектирования. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Наследование и композиция: компромиссы»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Одиночное и множественное наследование
- Виртуальные функции и таблица vtable
- Абстрактные классы и чисто виртуальные методы
- Наследование и композиция: компромиссы