Callverhalten bei Ableitungen
-
Hallo.
Ist dies im Standard so definiert, dass folgendes funktioniert?class Base { public: virtual void func1() { cout << "Base::func1" << endl; } }; class Derived : public Base { public: virtual void func1() { cout << "Derived::func1" << endl; } }; // ... Derived *pDerived = new Derived; pDerived->func1(); // "Derived::func1" ((Base*)pDerived)->func1(); // "Base::func1"?Gruß
-
Es ist zumindest definiert, dass Klassendefinitionen mit Semikola abgeschlossen werden sollen. :p
-
Kann ich mir nicht vorstellen: Der Clou an Polymorphie ist ja gerade dass ein Basisklassenzeiger die richtige Methode (in dem Fall also die von Derived) aufruft.
MfG SideWinder
-
@ matze: Unterschreib ich so!

@ SideWinder: Ok.Also müsste ich das immer so machen, oder?
class Base { public: virtual void func1() { cout << "Base::func1" << endl; } }; class Derived : public Base { public: virtual void func1() { Base::func1(); cout << "Derived::func1" << endl; } }; // ... Derived *pDerived = new Derived; pDerived->func1(); // "Base::func1", danach "Derived::func1"Gruß
-
So geht es, ja.
Direkt:
Base* pDerived = ...; pDervied->Base::func1()läuft nicht?
MfG SideWinder
-
Nein, funktioniert nicht (Visual Studio 2008).
Gruß
-
Ach du erzählst ja pallawatsch, probier's noch einmal

MfG SideWinder
-
Scheiße.. Hab mich wohl vertan. Geht tatsächlich

Gruß und Danke
-
Hi.
Dazu noch mal eine Frage: Wenn ich folgende Situation habe, ergibt sich dann eine Endlosaufrufschleife, oder wird (wie gewollt) die höchste Ableitung aufgerufen?class Base { public: virtual void func1() { cout << "Base::func1" << endl; this->Base::inflictor(); } virtual void inflictor() { // mach irgendwas this->inflictor(); // Base::inflictor() oder Derived::inflictor()? } }; class Derived : public Base { public: virtual void func1() { Base::func1(); cout << "Derived::func1" << endl; } virtual void inflictor() { } }; // ... Derived *pDerived = new Derived; pDerived->Base::func1();Gruß
-
Es wird Derived::inflictor() aufgerufen, da der statische Typ und auch der dynamische, sprich Laufzeittyp des Zeigers Derived ist.
Lg freeG
-
Allerdings halte ich sowas für schlechten Stil. Benutz lieber das NVI-Idiom (Non Virtual Interface) oder verwende virtuelle Funktionen so, wie sie gedacht sind. Sonst wird sich der Benutzer sicher ins Knie schiessen.