23 Stimmen

Private Vererbung VS Komposition: wann welche verwenden?

Private inheritance VS Komposition.

Ich habe etwas Verwirrung, wann ich jedes davon verwenden soll. Da die private Vererbung die Vererbungskette auf gewisse Weise abdichtet, gegeben:

class A
{
private:
    int z;
protected:
    int y;
public:
    int x;
};

class B : private A
{
    /* B's Datenmember und Methoden */
    /* B hat nur Zugriff auf A's öffentliche und geschützte Elemente */
};

class C : public B
{
    /* kann nicht auf die Felder von B zugreifen */
};

C wird nicht in der Lage sein, auf irgendwelche Felder von B zuzugreifen. Wann sollte ich private Vererbung verwenden und wann sollte ich Komposition verwenden?

Danke!

26voto

Alok Save Punkte 196241

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";
     }
 };

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X