Ключевое

Закрытое наследование и композиция представляют различные подходы к организации отношений между классами в C++. Закрытое наследование используется для создания класса-потомка, который имеет доступ к защищённым и частным членам родительского класса. Композиция, с другой стороны, обозначает, что один класс содержит в себе другой класс в качестве части своей реализации.


Определение:

  • Закрытое наследование (private inheritance) позволяет классу-потомку наследовать члены базового класса, но не делает их доступными для внешнего использования. Члены базового класса становятся доступными как защищённые или закрытые члены класса-потомка.
class Base {
private:
    int privateData = 42;
 
protected:
    int protectedData = 100;
};
 
class Derived : private Base {
public:
    void accessBaseData() {
        // privateData недоступен вне Derived
        // protectedData доступен внутри Derived
        std::cout << "Derived class accessing protected data: " << protectedData << std::endl;
    }
};
 
int main() {
    Derived d;
    d.accessBaseData(); // Вывод: Derived class accessing protected data: 100
 
    return 0;
}

Особенности:

  • Члены базового класса доступны как защищённые (protected) или закрытые (private) в зависимости от уровня доступа наследования.
  • Клиентский код не имеет доступа к защищённым или закрытым членам базового класса через объекты производного класса.

Композиция

Определение:

  • Композиция представляет собой отношение “имеет” (“has-a”), где один класс содержит объект другого класса как часть своей реализации.
class Engine {
public:
    void start() {
        std::cout << "Engine started" << std::endl;
    }
};
 
class Car {
private:
    Engine engine; // Композиция: Car имеет Engine
 
public:
    void startCar() {
        engine.start(); // Доступ к функциональности Engine через композицию
    }
};
 
int main() {
    Car car;
    car.startCar(); // Вывод: Engine started
 
    return 0;
}

Особенности:

  • Композиция позволяет создавать более модульные и гибкие классы, не зависящие напрямую от реализации других классов.
  • Класс, содержащий объект другого класса, полностью управляет временем жизни этого объекта и его ресурсами.

Сравнение:

  • Закрытое наследование используется для реализации “реализация как” (“is-implemented-as”) и предоставляет доступ к защищённым или закрытым членам базового класса.
  • Композиция используется для реализации “имеет” (“has-a”) и позволяет создавать объекты, содержащие другие объекты в качестве их частей.