[gelöst] Verständnisproblem mit virtual
-
Hallo,
ich versuche mich gerade an einer eigenen MySQL-Klasse mit wxWidgets. Dabei bin ich auf ein kleines Problem gestossen was mir nicht in den Kopf gehen will, weil es z.B. mit PHP so einfach ist.
class A { public: virtual wxString foo() { return _T("FOO von A");} wxString getfoo() { return foo(); } }; class B : public A { public: virtual wxString foo() { return _T("FOO von B");} }; //....in einer Funktion irgendwo im Quelltext.... { B vari; wxLogError(vari.getfoo()); // FOO von A }Müsste nicht wegen dem virtual hier eigentlich stehen "FOO von B" ???
Ich habe die Klasse A ja geerbt und die Funktion foo() virtuell überschrieben.Wo liegt mein Denkfehler?
Danke,
Stefan
-
Stichwort: Basisklassenzeiger
MfG
-
Eigentlich dürfte das nicht passieren (oder ich sehe irgendeinen total doofen Fehler in deinem Code nicht...). Ich habe mir gerade mal ein ähnliches Beispiel gebaut, um ganz sicher zu gehen und das funktioniert einwandfrei:
#include <string> #include <iostream> using namespace std; class Base { public: virtual string GetName() {return "Base";} string Get() {return GetName();} }; class Derived : public Base { public: virtual string GetName() {return "Derived";} }; int main() { Derived test; cout << test.Get(); return 0; }Gibt natürlich "Derived" aus...
Felix
-
Ich hab jetzt mal den g++ von 4.2.2 auf 4.3.2 upgedatet und mir das aktuellste wxWidgets vom PacMan geholt. Und siehe da, jetzt geht es. Ich hab zwar noch ein kleines Problem mit der .mb_str()-Funktion, aber die virtual-Funktionen arbeiten nun richtig. Weiß auch nicht wo jetzt der Bug war.
-
Ich hab den Bug gefunden. Suse 11 bieten eine lib an, die g++ 4.2.2 verwendet, die den Fehler verursacht hat. Der g++ 4.3.2 macht das irgendwie anders, daher geht es mit dem.
Die Info ist von ner portugisischen Seite, die mir ein Bekannter (dort wohnhaft) gefunden und grob übersetzt hat.