Wenn wir eine abstrakte Klasse definieren, die einen reinen virtuellen Destruktor hat, warum müssen wir dann einen Destruktor in der abstrakten Klasse definieren?Frage zum reinen virtuellen Destruktor
Antwort
Der Destruktor für die Basisklasse muss aufgerufen werden, wenn das Objekt zerstört wird. Daher muss eine Definition definiert werden.
Wie von Jesse erwähnt, werden geerbte Destruktoren immer aufgerufen (sie werden vom Compiler aufgerufen, ohne dass dieses Verhalten überschrieben werden kann). Daher muss ein virtueller Destruktor über eine Implementierung verfügen. Wenn also ein reiner virtueller Destruktor eine Implementierung haben muss, was ist der Unterschied zwischen einem reinen virtuellen Destruktor und einem regulären virtuellen Destruktor? Wenn Ihre abstrakte Klasse nur den virtuellen Destruktor deklariert hat und keine anderen rein virtuellen Methoden, verhindert der reine Inhalt des Destruktors, dass jemand die abstrakte Klasse instanziieren kann.
Nur ein virtueller dtor kann als rein deklariert werden. Aber nachdem Sie eine Deklaration hinzugefügt haben, müssen Sie den Hauptteil des dtor implementieren. Wie bereits erwähnt, rufen die Destruktoren ihr Eltern-dtor auf, und zwar bis zur Kette der Vererbung.
Da der Standard sagt so:
12.4.7 Ein Destruktor virtuell deklariert werden kann (10.3) bzw. rein virtuelle (10,4); Wenn im Programm Objekte dieser Klasse oder einer abgeleiteten Klasse erstellt werden, muss der Destruktor definiert werden.
Der Grund dafür ist, dass es explizit aufgerufen wird, wenn ein Objekt einer abgeleiteten Klasse zerstört wird.
Siehe auch die Antworten auf meine vorherige Frage: Under what circumstances is it advantageous to give an implementation of a pure virtual function?
Was ist mit dieser Antwort falsch ist? Oder SO für diese Angelegenheit? – Tobias
Es ist nicht richtig zu sagen, dass es "explizit" genannt wird. Es war hilfreich, dass Sie auf den Standard verwiesen haben, aber Sie sollten Ihre Antwort so bearbeiten, dass sie formell korrekter ist. "explizit" ist das Gegenteil davon, wie Destruktoren normalerweise aufgerufen werden. – nobar
Doppelte http://stackoverflow.com/questions/630950/pure-virtual-destructor-in-c – ralphtheninja