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?
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
:
Es ist unnötig zu sagen, dass dies böse ist.
Ö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 ...
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.
Wenn Sie privat erben, muss jeder Code, der die Umwandlung von Derived * in Base * erfordert, ein Mitglied oder ein Freund der Derived-Klasse sein.
Bei privater Vererbung verlieren Sie die Option, das abgeleitete Objekt als Objekt Ihrer Basisklasse zu behandeln.
Tags und Links c++ inheritance