Эта статья часто задаваемых вопросов C ++ отвечает на ваши вопросы удачно.
Воспроизведение здесь:
Используйте композицию, когда можете, приватнаследование, когда вам нужно.
Обычно вы не хотите иметь доступ к внутренним объектам слишком многих других классов, а частное наследование дает вам некоторые из этих дополнительных полномочий (и ответственности).Но личное наследие не зло;поддерживать его просто дороже, поскольку увеличивает вероятность того, что кто-то изменит что-то, что нарушит ваш код.
Законное долгосрочное использование для частного наследования - это когда вы хотите создать class Fred
, которыйиспользует код в class Wilma
, а код из class Wilma
должен вызывать функции-члены из вашего нового класса, Fred
.В этом случае Fred
вызывает не виртуалы в Wilma
, а Wilma
вызывает (обычно чистые виртуалы) сами по себе, которые переопределяются Fred
.Это было бы намного сложнее сделать с композицией.
class Wilma {
protected:
void fredCallsWilma()
{
std::cout << "Wilma::fredCallsWilma()\n";
wilmaCallsFred();
}
virtual void wilmaCallsFred() = 0; // A pure virtual function
};
class Fred : private Wilma {
public:
void barney()
{
std::cout << "Fred::barney()\n";
Wilma::fredCallsWilma();
}
protected:
virtual void wilmaCallsFred()
{
std::cout << "Fred::wilmaCallsFred()\n";
}
};