abstrakte Methode aus Destruktor aufrufen ...



  • ... geht nicht. Mein MinGW meckert das an. Über folgenden Umweg allerdings funktioniert es:

    class test
    {
    	public:
    		int a;
    
    		void testFunk(){abstracte_func();};
    		~test(){testFunk();};
    		virtual void abstracte_func() = 0;
    };
    
    class testb : public test
    {
    	public:
    		void abstracte_func();
    };
    
    void testb::abstracte_func()
    {
    	a = 5;
    }
    

    Das macht mich etwas stutzig ... wieso kann man nicht abstracte_func direkt aus ~test aufrufen - und mache ich etwas falsch, wenn ich das sozusagen 'hintenrum' doch tue?



  • Ich vermute mal, weil wenn test::~test() aufgerufen wird, das testtb schon zerstört wurde (mittels testb:::~testb()). Somit ist auch die Implementierung der abstrakten Methode nicht mehr vorhanden.

    Bei test::test_funk() wird es einfach nur Glück sein. Weil test::test_funk() ja nicht weiß, das es aus dem dtor aufgerufen wird.



  • wenn du im destruktor der basisklasse die funktion aufrufst, ist die instanz der ableitenden klasse schon zerstört. da die funktion in der basisklasse nicht implementiert ist und ableitende objekte nicht mehr existieren, ist keine klasse mehr beteiligt, die die funktion bereitstellen könnte. sie trotzdem aufzurufen dürfte zu undefiniertem verhalten führen.



  • weil der Destruktur der Basisklasse nach dem Löschen der abgeleiteten Klasse aufgerufen wird.

    Kannst es dir anschauen, indem du zum Test im ctor und dtor jeweils ein cout einbaust :

    class Base
    {
    public:
      Base() { std::cout << "ctor Base" << std::endl; }
      ~Base(){ std::cout << "dtor Base" << std::endl; }
    };
    
    class Derived : public Base
    {
     public:
      Derived () { std::cout << "ctor Derived " << std::endl; }
      ~Derived (){ std::cout << "dtor Derived " << std::endl; }
    };
    
    int main()
    {
       {
          Derived dummy;
       }
    }
    
    ctor Base
    ctor Derived
    dtor Derived
    dtor Base
    


  • Belli schrieb:

    ... geht nicht ...

    Grundsätzliche Regel:
    Niemals eine virtuelle Funktion im Konstruktor oder Destruktor aufrufen. Es sei den, du bist dir der Konsequenzen wohl bewusst.

    Ich verstehe aber eh nicht warum du eine virtuelle Funktion im Destruktor aufrufen möchtest. Bzw. Warum machst du den Aufruf nicht in dem Destruktor der entsprechenden Klasse.

    Edit: Und destruktoren von Basisklassen sollte man zudem "virtual" deklarieren...



  • asc schrieb:

    Belli schrieb:

    ... geht nicht ...

    Grundsätzliche Regel:
    Niemals eine virtuelle Funktion im Konstruktor oder Destruktor aufrufen. Es sei den, du bist dir der Konsequenzen wohl bewusst.

    Ich verstehe aber eh nicht warum du eine virtuelle Funktion im Destruktor aufrufen möchtest. Bzw. Warum machst du den Aufruf nicht in dem Destruktor der entsprechenden Klasse.

    Edit: Und destruktoren von Basisklassen sollte man zudem "virtual" deklarieren...

    Klar mit dem virtual deklarieren des Destruktors, hab ich beim Zusammenklimpern des Beispiels übersehen.

    Ansonsten danke an alle, ich hab fast befürchtet, daß das nicht geht.
    Warum ich das machen will/wollte?
    Ich mach im D'tor verschiedene Aufräumarbeiten. Die abstrakte Methode sieht in den abgeleiteten Klassen jeweils anders aus.
    Allerdings kann ich wohl genau diese zuerst im D'tor der abgeleiteten Klassen aufrufen, und den Rest im D'tor der Basisklasse lassen, denke ich?



  • Belli schrieb:

    Allerdings kann ich wohl genau diese zuerst im D'tor der abgeleiteten Klassen aufrufen, und den Rest im D'tor der Basisklasse lassen, denke ich?

    Genau. Jede Klasse räumt ihren eigenen "Schmutz" weg. Nur so ist der Code am Ende konsistent


Anmelden zum Antworten