Frage zum reinen virtuellen Destruktor

7

Wenn wir eine abstrakte Klasse definieren, die einen reinen virtuellen Destruktor besitzt, warum müssen wir dann einen Destruktor in der abstrakten Klasse definieren?

    
Kim 16.06.2009, 02:27
quelle

4 Antworten

15

Der Destruktor für die Basisklasse muss aufgerufen werden, wenn das Objekt zerstört wird, also benötigt er eine Definition.

    
Jesse Beder 16.06.2009, 02:31
quelle
9

Wie von Jesse erwähnt, werden geerbte Destruktoren immer aufgerufen (sie werden vom Compiler für Sie aufgerufen, ohne dass dieses Verhalten außer Kraft gesetzt werden kann), also muss ein virtueller Destruktor eine Implementierung haben. 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 Destruktor, dass jemand die abstrakte Klasse instanziieren kann.

    
Rngbus 16.06.2009 02:47
quelle
9

Weil der Standard dies sagt:

  

12.4.7 Ein Destruktor kann als virtuell (10.3) oder rein virtuell (10.4) deklariert werden; 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: Unter welchen Umständen ist es vorteilhaft, eine Implementierung einer reinen virtuellen Funktion zu geben?

    
Tobias 16.06.2009 08:28
quelle
3

Nur ein virtueller dtor kann als rein deklariert werden. Aber nachdem Sie eine Deklaration hinzugefügt haben, müssen Sie den Körper des dtor implementieren. Wie bereits erwähnt, rufen die Destruktoren ihren Eltern-dtor auf, alles bis zur Vererbungskette.

    
Nick Dandoulakis 16.06.2009 03:43
quelle

Tags und Links