0Pricing
C++ Academy · Урок

Наследование и композиция: компромиссы

Сравнивайте наследование и композицию и выбирайте подходящий инструмент для проектирования.

«Наследование и композиция: компромиссы» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Одиночное и множественное наследование
  2. Виртуальные функции и таблица vtable
  3. Абстрактные классы и чисто виртуальные методы
  4. Наследование и композиция: компромиссы
← Назад к C++ Academy