Dieser C++ FAQ-Eintrag beantwortet Ihre Fragen treffend.
Hier wird es repliziert:
Verwenden Sie Komposition, wenn Sie können, private Vererbung, wenn Sie müssen.
Normalerweise möchten Sie keinen Zugriff auf die Interna zu vielen anderen Klassen haben, und private Vererbung gibt Ihnen etwas mehr von dieser zusätzlichen Macht (und Verantwortung). Aber private Vererbung ist nicht schädlich; es ist einfach aufwendiger zu pflegen, da die Wahrscheinlichkeit steigt, dass jemand etwas ändert, das Ihren Code beschädigt.
Ein legitimer, langfristiger Einsatz von privater Vererbung besteht darin, wenn Sie eine Klasse Fred
erstellen möchten, die Code in einer Klasse Wilma
verwendet und der Code der Klasse Wilma
Mitgliedsfunktionen Ihrer neuen Klasse, Fred
, aufrufen muss. In diesem Fall ruft Fred
nicht virtuelle Funktionen in Wilma
auf, und Wilma
ruft (normalerweise reine virtuelle) Funktionen in sich selbst auf, die von Fred
überschrieben werden. Dies wäre mit Komposition viel schwieriger umzusetzen.
class Wilma {
protected:
void fredCallsWilma()
{
std::cout << "Wilma::fredCallsWilma()\n";
wilmaCallsFred();
}
virtual void wilmaCallsFred() = 0; // Eine reine virtuelle Funktion
};
class Fred : private Wilma {
public:
void barney()
{
std::cout << "Fred::barney()\n";
Wilma::fredCallsWilma();
}
protected:
virtual void wilmaCallsFred()
{
std::cout << "Fred::wilmaCallsFred()\n";
}
};