2009-08-19 5 views
0

Ist es möglich, auf eine Basisklassenfunktion zuzugreifen, die dieselbe Signatur wie eine abgeleitete Klassenfunktion mit einem abgeleiteten Klassenobjekt hat ?. Hier ist ein Beispiel von dem, was ich unter Angabe unten ..Zugriffsbasisklasse fn mit gleicher Signatur aus abgeleitetem Klassenobjekt

class base1 { 
public: 
    void test() 
    {cout<<"base1"<<endl;}; 
}; 

class der1 : public base1 { 
public: 
    void test() 
    {cout<<"der1"<<endl;}; 
}; 

int main() { 
der1 obj; 
obj.test(); // How can I access the base class 'test()' here?? 
return 0; 
} 
+1

Vielleicht sollte 'Überschreibung' Tag entfernt werden. Ich bin mir nicht 100% ig sicher, aber ich glaube, der richtige Begriff ist "verstecken" anstatt übersteuern. –

Antwort

6

Sie müssen vollständig die Methodennamen qualifizieren, wie es mit den ererbten einem Konflikt steht.

Verwendung obj.base1 :: test()

+3

Der formelle Begriff ist "überschreiben", da die Signaturen übereinstimmen. Andernfalls würden Sie sagen, dass die abgeleitete Methode die Basisklassenmethode "versteckt". In beiden Fällen gibt es keinen "geerbten Methodennamen" mehr. – MSalters

+1

Ich bezweifle, ob der richtige Begriff "überschreiben" oder "versteckt" ist. Im C++ - Standard wird 'override' nur mit virtuellen Funktionen verwendet und in 10.2 Member name lookup sagt der Standard: 'Ein Mitgliedsname f in einem Unterobjekt B verbirgt einen Mitgliedsnamen f in einem Unterobjekt A, wenn A ist Basisklassenunterobjekt von B. ' –

+0

Dank Arkaitz. –

1

Sie können keine Methode in abgeleiteten Klasse überschreiben, wenn Sie kein virtuelles Schlüsselwort vorsah.

class base1 
{ 
    public: 
     void test() 
     { 
      cout << "base1" << endl; 
     }; 
}; 

class der1 : public base1 
{ 
    public: 
     void test() 
     { 
      cout << "der1" << endl; 
     }; 
}; 

int main() 
{ 
    der1 obj; 
    obj.test(); // How can I access the base class 'test()' here?? 
    return 0; 
} 

Also der obige Code ist falsch. Sie haben zu geben:

virtual void test(); 

in Ihrer Basisklasse

+1

@ Styne666 Bitte seien Sie nicht unhöflich in Ihrer "Zusammenfassung bearbeiten". Das ist für jeden sichtbar. Lesen Sie die [faq] (http://stackoverflow.com/faq#etiquette) - "* Civility ist jederzeit erforderlich, Unhöflichkeit wird nicht toleriert *" – jadarnel27

0

Sie diese verwenden können:

((base)obj).test();