2010-04-13 13 views
10

In C++ können Sie ein Mitglied in eine Basisklasse und ein Mitglied mit demselben Namen in die geerbte Klasse einfügen.C++ geerbte Klasse hat ein Mitglied mit demselben Namen

Wie kann ich auf einen bestimmten in der geerbten Klasse zugreifen?

+3

Die Frage, die Sie sich stellen sollten, ist, warum haben Sie Klassen in der gleichen Vererbungshierarchie, die doppelt benannte Mitglieder haben, die unterschiedlich sind? Siehe wirksames C++ - Objekt 33. – TheJuice

+0

Wenn Ihre Frage darauf hinweist, wie Sie von einer Basisreferenz oder einem Zeiger auf die abgeleitete Methode zugreifen können, fügen Sie einen Kommentar hinzu. Wie es geschrieben ist, kann die Frage auf zwei Arten interpretiert werden (und alle Antworten beschäftigen sich nur mit einem von ihnen) –

Antwort

24

In diesem Fall sollten Sie einen Mitgliedsnamen vollständig qualifizieren.

class A 
{ 
public: 
    int x; 
}; 


class B : public A 
{ 
public: 
    int x; 
    B() 
    { 
    x = 0; 
    A::x = 1; 
    } 
}; 
2

Durch Voranstellen mit classname::.

7

Wenn Sie den Namen angeben, greifen Sie automatisch auf den Namen in der geerbten Klasse zu. Wenn Sie meinen, wie Sie auf das in der Basisklasse zugreifen, verwenden Sie Base :: member

3

Ja.

Qualifizieren Sie Ihren Anruf, f(), mit einem Klassennamen: SpecificClass::f().

6

Um auf das ausgeblendete Element in der Basisklasse zuzugreifen, müssen Sie dem Elementnamen den Namen der Basisklasse voranstellen. Siehe unten:

class A 
{ 
protected: 
    int i; 
}; 

class B : public A 
{ 
public: 
    void foo(void) 
    { 
     int a_i = A::i; 
     int b_i = i; 
     int b_i_as_well = B::i; 
    } 
private: 
    int i; 
}; 
+0

+2 [ich wünsche] für das Beispiel. –

3

Ein Ansatz (bereits in allen anderen Antworten erwähnt) ist die qualifizierte Mitgliedsnamen zu verwenden, wie Base::member. Es kann in Verbindung mit explizitem Zugriff durch this Zeiger verwendet werden, wenn das Ihr Stil ist: this->Base::member.

Ein anderer Ansatz besteht darin, den Zugriff über den Zeiger this auszuführen, der explizit in den Basisklassentyp konvertiert wurde: ((Base *) this)->member.

Natürlich sind die obigen Verweise auf this Zeiger unter der Annahme gemacht, dass Sie versuchen, auf das Mitglied aus einigen nicht-statischen Member-Funktion der Klasse zuzugreifen. Um auf "von außen" zuzugreifen, können dieselben Tricks auf jeden anderen Zeiger (oder Referenz) angewendet werden: some_pointer->Base::member oder ((Base *) some_pointer)->member.

Für Datenelemente sind diese beiden Ansätze gleichwertig. Für Elementfunktionen können sie zu unterschiedlichen Ergebnissen mit virtuellen Funktionen führen. Aus diesem Grund sollte im Allgemeinen der erste Ansatz bevorzugt werden.

Verwandte Themen