9 Stimmen

privates Erbe

Ich verstehe das nicht ganz:

class Base
{
    public:
    Base()
    {
        cout<<"Base" << endl;
    }

    virtual void call()
    {
        cout<<"Base call" << endl; 
    }
};

class Derived: private Base
{
    public:      
    Derived()
    {
        cout<<"Derived" << endl;
    } 
};

int main(void)
{
    Base *bPtr = new Derived(); // This is not allowed
}

Ist es, weil jemand Aufruf() mit bPtr, die tatsächlich auf abgeleitete Objekt getan wird? Oder gibt es einen anderen Grund?

26voto

Kaz Dragon Punkte 6406

Öffentliche Vererbung bedeutet, dass jeder weiß, dass Derived von Base abgeleitet ist.

Geschützte Vererbung bedeutet, dass nur Derived, Freunde von Derived und von Derived abgeleitete Klassen wissen, dass Derived von Base abgeleitet ist.

Private Vererbung bedeutet, dass nur Derived und Freunde von Derived wissen, dass Derived von Base abgeleitet ist.

Da Sie private Vererbung verwendet haben, hat Ihre main()-Funktion keine Ahnung von der Ableitung von base und kann daher den Zeiger nicht zuweisen.

Private Vererbung wird in der Regel verwendet, um die "ist-implementiert-in-der-Beziehung von" zu erfüllen. Ein Beispiel könnte sein, dass Base eine virtuelle Funktion zur Verfügung stellt, die Sie überschreiben müssen - und von der Sie daher erben müssen - aber Sie wollen nicht, dass die Clients wissen, dass Sie diese Vererbungsbeziehung haben.

*auch: wie viel Holz würde ein Murmeltier werfen...

23voto

Konrad Rudolph Punkte 503837

Nach allgemeinem Verständnis von Vererbung ist die "private Vererbung" in C++ eine schreckliche Fehlbezeichnung: Sie ist no Vererbung (soweit es um alles außerhalb der Klasse geht), sondern ein vollständiges Implementierungsdetail der Klasse.

Von außen betrachtet ist die private Vererbung eigentlich so ziemlich dasselbe wie der Nachlass. Nur im Inneren der Klasse gibt es eine spezielle Syntax, die mehr an Vererbung als an Komposition erinnert.

Allerdings gibt es einen Vorbehalt: C++ behandelt dies syntaktisch als Vererbung, mit allen Vorteilen und Problemen, die dies mit sich bringt, wie z.B. Sichtbarkeit und Zugänglichkeit des Geltungsbereichs . Außerdem ignorieren C-artige Casts (aber kein C++-Cast!) tatsächlich die Sichtbarkeit und können daher erfolgreich Ihre Derived Zeiger auf Base :

Base* bPtr = (Base*) new Derived();

Unnötig zu erwähnen, dass dies eine böse .

12voto

sbi Punkte 211669

Denn private bedeutet "Implementierungsdetail", wodurch die Tatsache, dass Derived leitet sich ab von Base ein Detail der Implementierung.

Die private Vererbung ist keine Schnittstellenvererbung, sondern eine Implementierungsvererbung. Sie implementiert keine "Is-A"-Beziehung, sondern eine "Is-Implemented-Using"-Beziehung. Derived ist kein Base Soweit es die Nutzer der Klassen betrifft, wird sie (derzeit) zufällig damit implementiert.

1voto

Maximilian Mayerl Punkte 10839

Bei der privaten Vererbung verlieren Sie die Möglichkeit, Ihr abgeleitetes Objekt als ein Objekt Ihrer Basisklasse zu behandeln.

1voto

sellibitze Punkte 26706

Wenn Sie privat erben, muss jeder Code, der die Umwandlung von Abgeleitet* in Basis* erfordert, ein Mitglied oder ein Freund der abgeleiteten Klasse sein.

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