Warum ist dieser qualifizierte Name bei Mehrfachvererbung mehrdeutig?

8

Ich versuche auf die Elementvariable x in struct Anfang zuzugreifen, indem ich ein Bottom -Objekt verwende.

Der Code ist der folgende:

%Vor%

Dies gibt den folgenden Fehler mit gcc 4.8:

%Vor%

Wie ist das mehrdeutig und wie kann ich mit einem qualifizierten Namen darauf zugreifen?

    
anoncoder 20.09.2014, 19:46
quelle

1 Antwort

4

Das Problem ist, dass C ++ keine Möglichkeit hat, das Konzept von "mehrstufigen" Klassenmitgliedern direkt auszudrücken, wie zum Beispiel "das Mitglied x des Top Unterobjekts von Left ". Was Left::Top::x bedeutet, ist "das Mitglied x in dem mit Left::Top bezeichneten Typ" - und der mit Left::Top bezeichnete Typ ist genau Top .

Aus diesem Grund können Sie seltsame Dinge wie

schreiben %Vor%

, weil die rechte Seite von = exakt &Top::x entspricht und ein Zeiger-zu-Basis-Klassenglied implizit in ein Zeiger-zu-abgeleitet-Klassenglied umgewandelt werden kann. (Das Ergebnis dieser Konvertierung bezieht sich immer noch auf das Member im Basisklassen-Subobjekt der abgeleiteten Klasse.)

Um zu disambiguieren, können Sie entweder etwas in der Art von static_cast<Left &>(b).Top::x tun oder einen Pointer-to-member verwenden - int Left::* ptr = &Top::x; , b.*ptr verweist auf x im Unterobjekt Top des Left Unterobjekt von b .

    
T.C. 20.09.2014, 21:07
quelle