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.