Virtueller Destructor



  • hallo,

    wieso muss man in die Basisklasse(rein/virtuell), von welcher man ableitet immer virtuellen Destructor schreiben ?

    danke



  • Man muss dies nicht immer tun, nur wenn man das abgleitete Objekt durch einen Zeiger oder eine Referenz auf das Basisobjekt löschen möchte, sollte der Basisdestruktor virtuell sein, damit der korrekte Destruktor aufgerufen wird.



  • Weil du unter Umständen zur destruction time den Typ nicht mehr kennst. Ich geb mal ein Beispiel:

    #include <iostream>
    
    struct A { ~A() { std::cout << "A::~A()" << std::endl; } };
    struct B : public A { ~B() { std::cout << "B::~B()" << std::endl; } };
    struct C { virtual ~C() { std::cout << "C::~C()" << std::endl; } };
    struct D : public C { virtual ~D() { std::cout << "D::~D()" << std::endl; } };
    
    int main() {
      A *p = new B;
      C *q = new D;
    
      delete p;
      delete q;
    }
    

    Wie du siehst, wird der Destruktor von B nicht ausgeführt, weil du den delete-Operator für die Klasse A aufrufst. Dagegen wird der Destruktor von D aufgerufen, weil der Destruktor virtuell ist und zur Laufzeit aus der virtual method table ausgelesen wird.


Log in to reply