Das folgende einfache Beispiel erzeugt einen Compilerfehler, da ich versehentlich private Vererbung verwende:
main.cpp: 21: Fehler: 'A' ist eine unzugängliche Basis von 'B'
%Vor% Können Sie mir helfen und erklären, was genau in der Basisklasse nicht zugänglich ist und warum es bei der Konvertierung von B*
nach A*
benötigt wird?
Könnten Sie mir helfen und erklären, was genau in der Basisklasse nicht zugänglich ist und warum es bei der Konvertierung von B * nach A * benötigt wird?
Abgesehen von B
und den Freunden von B
ist die einfache Tatsache, dass B
ein A
ist, nicht sichtbar. Dadurch wird eine Membervariable oder Memberfunktion nicht ausgeblendet, aber die Beziehung selbst wird ausgeblendet. Deshalb können Sie von main
nicht das Ergebnis von new B
mit einem Zeiger auf A
binden, denn solange main
betroffen ist, ist B
kein A
(genauso wie Sie konnte A * p = new unrelated;
) nicht tun
Warum es benötigt wird, die Antwort ist genau das gleiche: weil ohne Zugriff auf die Beziehung, der Compiler nicht weiß (na ja, es weiß, aber wird Ihnen nicht sagen), wie Sie einen Zeiger auf die% co_de erhalten % subject in A
, denn soweit es in diesem Kontext sichtbar ist, gibt es keine Beziehung zwischen B
und A
überhaupt.
Auf die -Konvertierung von B*
bis A*
kann nicht zugegriffen werden, da das Basisklassenunterobjekt privat ist . Wenn Sie B*
in A*
konvertieren, geben Sie den Zeiger auf das Unterobjekt der Basisklasse zurück . Letzteres muss zugänglich sein, damit die Konvertierung zugänglich ist. In jeder Funktion, die ein Freund von B
ist, wird die Konvertierung verfügbar. Übrigens können Sie immer auf die Konvertierung durch eine explizite Umwandlung zugreifen.
Beachten Sie, dass in einigen Fällen nur eine barrierefreie Konvertierung erforderlich ist. In einigen Fällen muss A
jedoch eine öffentliche (stärker als barrierefrei) Basis von B
sein. Wenn Sie beispielsweise versuchen, eine Ausnahme vom Typ B
mit catch(A&)
abzufangen, ist A
eine öffentliche Basisklasse von B
. .
Die öffentliche / private Vererbung ist äquivalent für die Variable "public / private member".
Das Ergebnis der Konvertierung ist eine Referenz auf das Basisklassenunterobjekt des abgeleiteten Klassenobjekts .
Ich denke, die Erreichbarkeit bedeutet die Erreichbarkeit des Basisklassen-Unterobjekts des abgeleiteten Klassenobjekts. Für den Client ist das Basisklassen-Unterobjekt nur zugänglich, wenn wir öffentliche Vererbung verwenden. Für die Elementfunktion der abgeleiteten Klasse ist dies egal public / protected / privaye Vererbung, das Basisklassen-Unterobjekt ist zugänglich.
%Vor%OK.I bedeutet, dass die öffentliche / private Vererbung der öffentlichen / privaten Mitgliedsvariablen entspricht.
Referenz: Ссылка
Tags und Links c++