Ключевое
Закрытое наследование и композиция представляют различные подходы к организации отношений между классами в 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”) и позволяет создавать объекты, содержащие другие объекты в качестве их частей.