virtual Destruktor



  • normalerweise muss man destruktor als virtual definieren, dann bei delete object von der base class wird das objekt von der abgeleiteten class auch mitgelöscht

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

    Aber wie wird das Mechanisum ausgelöst?

    object von Derived
    ------
    |vptr|-------->&~Base()
    |    |-------->&~Derived()
    ------
    |f1  |
    ------
    

    bei delete b wird ~Base ausgelöst, weil b ist vom typ Base
    ~Derived wird nicht aufgerufen.
    Ergebnis ist allerdings anders, ~Base und ~Derived werden hintereinander aufgerufen, wie erklärt man mit v-table?



  • b ist zwar offiziell vom Typ Base, wurde aber mit "new Derived()" erzeugt, deshalb verweist sein vptr auch auf die vtable von Derived (in der unter "Destruktor" der ~Derived() eingetragen ist.

    Dazu kommt noch, daß der Compiler nach deinen eigenen Dtor-Anweisungen noch alle Dtoren der Membervariablen und der Basisklasse(n) aufruft.



  • netrobot schrieb:

    normalerweise muss man destruktor als virtual definieren

    Naja, "normalerweise" ist relativ. Virtuelle dtors machen nur bei public Vererbung Sinn, und selbst dann nicht immer.


Anmelden zum Antworten