private Vererbung

7

Ich verstehe das nicht vollständig:

%Vor%

Liegt es daran, dass jemand call () mit bPtr aufrufen könnte, was tatsächlich für abgeleitete Objekte getan wird? Oder gibt es einen anderen Grund?

    
nitin soman 16.10.2009, 09:04
quelle

6 Antworten

18

Aus einem allgemeinen Verständnis der Vererbung ist C ++ "private Vererbung" eine schreckliche falsche Bezeichnung: Es ist nicht Vererbung (soweit alles außerhalb der Klasse betroffen ist), sondern eine vollständige Implementierung von die Klasse.

Von außen betrachtet, ist private Vererbung eigentlich so ziemlich wie Komposition. Nur im Inneren der Klasse erhalten Sie eine spezielle Syntax, die eher an Vererbung als an Komposition erinnert.

Es gibt jedoch eine Einschränkung: C ++ behandelt dies syntaktisch als Vererbung mit allen Vorteilen und Problemen, die damit verbunden sind, wie Sichtbarkeit des Bereichs und Zugänglichkeit Außerdem ignorieren C-artige Umwandlungen (aber keine C ++ - Umwandlung!) Die Sichtbarkeit und es ist daher erfolgreich, den Derived Zeiger auf Base :

zu setzen %Vor%

Es ist unnötig zu sagen, dass dies böse ist.

    
Konrad Rudolph 16.10.2009, 09:11
quelle
17

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

Geschützte Vererbung bedeutet, dass nur Abgeleitete, Abgeleitete und Abgeleitete Klassen wissen, dass Abgeleitet von Basis abgeleitet ist. *

Private Vererbung bedeutet, dass nur Abgeleitete und Freunde von Abgeleiteten wissen, dass Abgeleitet von Basis abgeleitet ist.

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

Private Vererbung wird normalerweise verwendet, um die Beziehung "ist implementiert in Begriffen" zu erfüllen. Ein Beispiel könnte sein, dass Base eine virtuelle Funktion verfügbar macht, die Sie überschreiben müssen - und daher geerbt werden muss - aber Sie möchten nicht, dass Clients wissen, dass Sie diese Vererbungsbeziehung haben.

* auch: wie viel Holz würde ein Murmeltierfutter ...

    
Kaz Dragon 16.10.2009 10:27
quelle
9

Weil private "Implementierungsdetail" bedeutet, was die Tatsache, dass Derived von Base abgeleitet ist, zu einem Implementierungsdetail macht.

Private Vererbung ist keine Schnittstellenvererbung, sondern Implementierungsvererbung. Es implementiert keine "Is-A" -Beziehung, sondern eine "Is-Implementierte-Using" -Beziehung. Derived ist kein Base , soweit es die Benutzer der Klassen betrifft, wird es gerade (gerade) mit diesem Code implementiert.

    
sbi 16.10.2009 10:16
quelle
1

Wenn Sie privat erben, muss jeder Code, der die Umwandlung von Derived * in Base * erfordert, ein Mitglied oder ein Freund der Derived-Klasse sein.

    
sellibitze 16.10.2009 09:12
quelle
1
Sergei Kurenkov 16.10.2009 10:21
quelle
0

Bei privater Vererbung verlieren Sie die Option, das abgeleitete Objekt als Objekt Ihrer Basisklasse zu behandeln.

    
Maximilian Mayerl 16.10.2009 09:08
quelle

Tags und Links