Frage zu virtual
-
Kurze ja/nein Fragen:
///////// // Base.h CBase { // ... public: virtual void VirtualFunc(); void BaseFunction(); // ... } /////////// // Base.cpp void CBase::VirtualFunc() { // Base Virtual Function } void CBase::BaseFunction() { VirtualFunc(); } //////////// // Derived.h class CDerived : public CBase { // ... void VirtualFunc(); void BaseFunction(); // ... } ////////////// // Derived.cpp void CDerived::VirtualFunc() { // Derived Virtual Function } void CDerived::BaseFunction() { CBase::BaseFunction(); }Meine Fragen:
Wenn ich BaseFunction von CDerived aufrufe, wird dann VirtualFunc von CDerived oder von CBase in der CBase::BaseFunction aufgerufen?
Wenn ich ein CBase Objekt habe und die Funktion VirtualFunc aufrufe, wird dann die Funktion CDerived::VirtualFunc aufgerufen?Jo und das ist es glaub ich schon.
Danke für die Antworten.
Grüssli
-
Ja, es wird die virtuelle Funktion aufgerufen. Es hängt immer nur von der Funktion ab, welche aufgerufen wird, nicht vom Kontext, also ob die Aufrufstelle eine virtuelle Funktion ist oder nicht. Es wäre auch ziemlich überraschend, wenn der selbe Funktionsaufruf in einer virtuellen und einer nicht virtuellen Funktion völlig unterschiedlichen Effekt hätte.
Ein genereller Tip für solche Fragen: Probier's aus. Schreib einfach in jede Funktion ein cout << "Funktionsname" bzw. auf vielen Compilern einfach cout << __FUNC__; rein, schreib die main und schau Dir an, welche Ausgaben gemacht werden. Oder nimm einen Debugger und durchlaufe den Code.
-
Dravere schrieb:
Wenn ich BaseFunction von CDerived aufrufe, wird dann VirtualFunc von CDerived oder von CBase in der CBase::BaseFunction aufgerufen?
die Derived-Version
Wenn ich ein CBase Objekt habe und die Funktion VirtualFunc aufrufe, wird dann die Funktion CDerived::VirtualFunc aufgerufen?
die Base-Version
(es hängt nur vom zugrundeliegenden Objekt ab, welche Version der virtuellen Funktion aufgerufen wird)
-
Ok danke ... dann habe ich das virtual Gebiet nun doch vollständig begriffen, naja zumindest was die Funktionen betrifft. Eine virtuelle Basisklasse habe ich noch nicht gebraucht.
Grüssli