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_slicing

    Gruß
    Dobi



  • So einfach war das! super, danke dir


Anmelden zum Antworten