2010-12-24 8 views
10

Auf welche Weise sollte ich auf diese übergeordnete Methode und die übergeordnete Variable zugreifen?C++: Zugriff auf übergeordnete Methoden und Variablen

class Base 
{ 
public: 
    std::string mWords; 
    Base() { mWords = "blahblahblah" } 
}; 

class Foundation 
{ 
public: 
    Write(std::string text) 
    { 
     std::cout << text; 
    } 
}; 

class Child : public Base, public Foundation 
{ 
    DoSomething() 
    { 
     this->Write(this->mWords); 
     // or 
     Foundation::Write(Base::mWords); 
    } 
}; 

Danke.

Edit: Und was, wenn es Unklarheit gibt?

Antwort

10

Die beide Syntaxen Sie in Ihrem Code verwenden (this->... und qualifizierte Namen) sind nur speziell notwendig, wenn es Unklarheiten oder eine andere Name Lookup-Ausgabe ist, wie Namen verstecken, Vorlage Basisklasse usw.

Wenn nicht gibt es Mehrdeutigkeit oder andere Probleme brauchen Sie keine dieser Syntaxen. Alles, was Sie brauchen, ist ein einfacher unqualifizierter Name, wie in Ihrem Beispiel Write. Nur Write, nicht this->Write und nicht Foundation::Write. Gleiches gilt für mWords.

I.e. In Ihrem speziellen Beispiel funktioniert eine einfache Write(mWords) gut.


Um die oben zu zeigen, wenn Ihre DoSomething Methode mWords Parameter hat, wie in

DoSomething(int mWords) { 
    ... 

dann diesen lokalen mWords Parameterklassen Mitglied mWords geerbt verstecken würden und Sie würden entweder

verwenden müssen
DoSomething(int mWords) { 
    Write(this->mWords); 
} 

oder

DoSomething(int mWords) { 
    Write(Foundation::mWords); 
} 

, um Ihre Absicht richtig auszudrücken, d. H. Um das Verstecken zu durchbrechen.


Wenn Ihre Child Klasse hat auch sein eigenes mWords Mitglied, wie in

class Child : public Base, public Foundation 
{ 
    int mWords 
    ... 

dann dieser Namen die geerbte mWords verstecken würde. Der this->mWords Ansatz würde in diesem Fall nicht helfen, die richtigen Namen sichtbar machen, und Sie würden die qualifizierten Namen verwenden, um das Problem zu lösen

DoSomething(int mWords) { 
    Write(Foundation::mWords); 
} 

Wenn Ihre beiden Basisklassen hatten ein mWords Mitglied in

class Base { 
public: 
    std::string mWords; 
    ... 
}; 

class Foundation { 
public: 
    int mWords; 
    ... 

, wie dann in Child::DoSomething der mWords Name zweideutig wäre, und Sie würden zu tun haben

DoSomething(int mWords) { 
    Write(Foundation::mWords); 
} 

um die Mehrdeutigkeit aufzulösen.


Aber noch einmal, in Ihrem speziellen Beispiel, wo es keine Zweideutigkeit und kein Name alles versteckt ist völlig unnötig.

+0

macht Sinn. Vielen Dank! –

0

Ich denke, dies ist der häufigste Ansatz ist:

Write(mWords); 

es sei denn, Sie in Zweideutigkeit führen.

Wenn es Unklarheiten oder Spiegelungen gibt, weil Sie etwas in einer (bestimmten) Basisklasse haben möchten, aber etwas in einer anderen Basisklasse (oder dieser Klasse) es verbirgt, dann verwenden Sie die Base::name Syntax.

Wenn eine lokale Variable eines Ihrer Mitglieder überschattet, verwenden Sie this->, obwohl Sie im Allgemeinen versuchen sollten, diese Situation zu vermeiden. (Dh: versuchen Einheimischen zu vermeiden Namensgebung, dass sie Mitglieder Schatten)

ich einen Weg nehme an, es zu betrachten, die erste davon zu verwenden, wäre das funktioniert und das tut, was Sie wollen:

  1. name
  2. this->name
  3. Base::name
+0

Ja, ich muss vielleicht mit Ambiguität umgehen ... Ich werde in meinem ursprünglichen Beitrag klären. –

0

Da es keinen Namenskonflikt ist, einfach Write(mWords) verwenden. Verwenden Sie die anderen 2, wenn Sie lokale Variablen haben, die Konflikte verursachen, oder wenn die Namen ausgeblendet sind.

+0

Wenn es Konflikte gibt, welche Methode empfehle ich? –

+0

und was meinst du mit "wenn die Namen versteckt sind"? –

+0

Wenn es einen Konflikt zwischen lokalen Variablen und Membervariablen gibt (z. B. hat Ihre Klasse eine Membervariable "i", und Ihre Methode verwendet auch eine lokale Variable "i"), verwenden Sie "this". Wenn 'A' eine Funktion' f' deklariert und 'B'' A' erbt und 'f' ebenfalls deklariert, und Sie' A' 'f' von' B' nennen wollen, dann verwenden Sie 'A :: f'. – lijie