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.


Anmelden zum Antworten