komisches Verhalten bei Vererbung in C++ ...
-
Hallo, warum geht folgendes Statement in C++ nicht?
#include <iostream> #include <stdlib.h> using namespace std; class Base{ int i; public: Base(int s):i(s){ cout << "Base constructor. " << endl; } void f(){ cout << "Base::f()\n"; } }; class Sub : public Base{ int i; public: Sub(int a, int b): i(a), Base(i){ cout << "Sub constructor. " << endl; } void f(double i){ cout << "Sub::f(double i)\n"; } }; int main(){ Sub * s = new Sub(4, 5); s->Base::f(); // ruft f() der Basisklasse auf //s->f(); //FEHLER: ?????????? WIESO? return 9; }
Ist dies eine spezielle Eigenschaft von C++, dass Methoden, die in der abgeleiteten Klasse eine andere Signatur haben, nicht sichtbar sind (obwohl durch Vererbung alle Methoden der Basisklasse an die SubKlasse vererbt werden).
Wo ist des Rätsels Lösung zu suchen: Compiler? static_bind? oder sonst wo?vielen Dank für eure Anworten
-
Das ist C++ Standard !
"Ueberschreibst" du ne Methode in ner abgeleiteten Klasse mit ner anderen Signatur, verdeckst du die alte Funktion in der Basisklasse.
Sprich, der Compiler sucht nach der Funktion f. Er findet f im naheliegensten Namensraum (dem der abgeleiteten klasse), deshalb hoert er auf mit suchen, auch wenn die Signatur nicht stimmt, und gibt dir nen Fehler zurueck.
Wenn du die Basisfunktion ebenfalls benutzen willst, musst sie expliziet in dem neuen Namensraum, deiner abgeleiteten Klasse, bekannt machen.
using Base::f(); in der Abgeleiteten klasse definieren!.
Ciao ...
-
ja, du hast recht, das ist eine eigenschaft von c++.
laut stroustroup gibt es keine überladungs-auflösung zwischen abgeleiteten klassen, siehe: http://www.research.att.com/~bs/bs_faq2.html#overloadderived;ein
using Base::f;
löst dein problem.
class Sub: public Base { public: using Base::f; void f(double i); };
-
Hallo,
ein Blick in unsere C++ FAQs hätte deine Frage beantwortet: