nicht "so" virtuale Funktionen
-
Hallo
ich bin gerade etwas verwundert wie virtuale funktionen sich verhalten - aus der Schule kann ich mich erninnern, dass für virtuale Funktionen eine Tabelle angelegt wird, wie angibt zu welcher Klasse die Funktion jetzt dazu gehört und die richtige Funktion wird dann aufgerufen.
Aber es funktioniert nicht so wie ich es mir dachte...In dem beispiel werden schon richtige Klassen geworfen - so wie es gedacht war - nur die Ausgabe der pError Funktion ist immer gleich, nämlich die von EBase Klasse. Ich dachte da die funktionen virtual sind, dass diese damit unterschieden werden können.
#include <iostream> #include <cstring> // Basisklasse class EBase : public std::exception { public: virtual void pError( ){ std::cerr << "EBase exception" << std::endl; } }; // Abgeleitete Klasse class EChild : public EBase { public: virtual void pError( ){ std::cerr << "EChild Exception" << std::endl; } }; // foo kann sowohl EBase, wie auch EChild werfen void foo ( int argc) { if (argc == 1) { throw EBase(); } else { throw EChild(); } } int main (int argc, char** argv) { try { foo( argc ); } catch ( EBase e ) { e.pError( ); } return 0; }Wieso ist die Ausgabe immer von EBase und nie von EChild?
Danke
-
Du sliced deine Exception, weil du sie per value fängst.
Versuchs mal so:
catch ( EBase& e )Edit:
"Throw by value, catch by reference."
Im Prinzip passiert dir sonst das hier:
http://en.wikipedia.org/wiki/Object_slicingGruß
Dobi
-
So einfach war das! super, danke dir