Автор этой статьи утверждает, что
"Обычно вы не хотите иметь доступ к внутренним компонентам слишком многих других классов, и частное наследование дает вам некоторую дополнительную силу (и ответственность). Но частное наследование не является злом; просто дороже поддерживать, поскольку это увеличивает вероятность того, что кто-то изменит что-то, что нарушит ваш код. "
Предположим, следующий код, где Car
наследуется от Engine
в частном порядке:
#include <iostream>
using namespace std;
class Engine
{
int numCylinders;
public:
class exception{};
Engine(int i) { if( i < 4 ) throw exception(); numCylinders = i; }
void start() { cout << "Engine started " << numCylinders << " cylinders" << endl; }
};
class Car : private Engine
{
public:
Car(int i) : Engine(i) {}
using Engine::start;
};
int main()
{
try
{
Car c(4);
c.start();
}
catch( Engine::exception& )
{
cout << "A Car cannot have less than 4 cylinders" << endl;
}
}
Мой вопрос: как Car
может взломать этот код, настроив, например, его Engine
с менее чем 4 цилиндрами, используя частное наследование и без защищенных членов в базовом классе?