virtual dtor



  • Ich weiß - das Thema gibts allein hier im Forum schon ca. 7,3 Millionen Mal und
    eigentlich dachte ich ja auch, es verstanden zu haben.
    Aber nachdem ich ein paar der Thread noch mal durchgelesen habe, habe ich das versucht:

    struct a
    	{
    		a (void)
    			{};
    		/*virtual*/ ~a (void)
    			{};
    	};
    
    struct b : public a
    	{
    		b (void)
    			{};
    		~b (void)
    			{};
    	};
    
    int main (int argc, char* argv[]) 
    {
    	a *bla = new a;
    	delete bla;
    	b *blub = new b;
    	delete blub;
    };
    

    egal, ob mit oder ohne virtual, immer wird auch der destruktor von a aufgerufen - wieso das?
    ich dachte ja immer, dass man den dtor als virtual deklariert, damit er mit aufgerufen wird, wenn man die instanz einer abgeleitete klasse löscht und wenn er nicht virtual ist die Instanz des Basisobjekts weiter im Speicher rumdümpelt? Oo

    danke schon mal

    bb



  • virtual -> Destruktor des dynamischen Typs (der abgeleiteten Klasse) wird aufgerufen, auch wenn der statische Typ ein anderer ist.
    non-virtual -> Destruktor des statischen Typs wird aufgerufen.

    Destruktoren von Basisklassen werden immer implizit aufgerufen.



  • LordJaxom schrieb:

    virtual -> Destruktor des dynamischen Typs (der abgeleiteten Klasse) wird aufgerufen, auch wenn der statische Typ ein anderer ist.

    Ein anderer als was?



  • class Base {
      public: virtual ~Base() {}
    };
    class Derived {
      public: virtual ~Derived() {}
    };
    int main() {
      Base* b = new Derived();
      delete b;
    }
    

    Ohne virtual würde hier nur der Destruktor von Base aufgerufen werden. Der Derived-Anteil würde nicht gelöscht werden.
    Mit virtual wird der Destruktor von Derived und der von Base aufgerufen, womit das Objekt vollständig gelöscht wird.



  • Und was ist eigentlich, wenn man keinen eigenen Destruktor erstellt? Ist der vom Compiler bereitgestellte Destruktor auch virtual ? Kaum oder?



  • Nein, der Default-Dtor ist nicht automatisch virtuell.



  • Wenn der Destruktor der Basisklasse virtual ist, dann ist auch der Destruktor aller davon abgeleiteten Klassen virtual, egal ob selber erstellt oder nicht.
    Standard 12.4 7



  • Braunstein schrieb:

    Wenn der Destruktor der Basisklasse virtual ist, dann ist auch der Destruktor aller davon abgeleiteten Klassen virtual, egal ob selber erstellt oder nicht.
    Standard 12.4 7

    Ich denke, dass es Nexus um der Base-dtor ging und nicht um die Ableitungen.



  • Ich hatte mich auf den Beitrag von OhneName bezogen.



  • unskilled schrieb:

    LordJaxom schrieb:

    virtual -> Destruktor des dynamischen Typs (der abgeleiteten Klasse) wird aufgerufen, auch wenn der statische Typ ein anderer ist.

    Ein anderer als was?

    Der Destruktor des dynamischen Typs wird aufgerufen, auch wenn der statische Typ ein anderer als der dynamische Typ ist.


Anmelden zum Antworten