Zeiger auf Basisklasse und private Vererbung

8

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?

    
Ronald McBean 05.09.2011, 11:40
quelle

6 Antworten

10

Private Vererbung bedeutet, dass B für alle außer B (und Freunden von B) nicht von A abgeleitet ist.

    
Jan 05.09.2011, 11:44
quelle
7
  

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.

    
quelle
1

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.

%Vor%

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 . .

    
Armen Tsirunyan 05.09.2011 11:55
quelle
0

Da B von A geerbt wird, würde der Standardkonstruktor von A vor dem Konstruktor von B aufgerufen werden. Da er jedoch privat ist und nicht an B vererbt wird, erhalten Sie einen Compilerfehler.

    
Meysam 05.09.2011 11:49
quelle
0

Da der Verweis oder Zeiger der Basisklasse nicht auf das Objekt der geerbten Klasse zeigen kann, tut es das bedeutet, dass geschützte und private Vererbung nichts mit Polymorphismus zu tun hat?

    
Donglei 08.07.2013 02:24
quelle
0

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: Ссылка

    
jie.zhou 16.09.2014 18:06
quelle

Tags und Links