virtueller Destruktor in der reinen abstrakten Basisklasse

8

Ich habe

%Vor%

GCC besteht darauf, dass ich

habe %Vor%

Ich verstehe nicht warum. Eine reine Schnittstelle ist alles über die Schnittstelle (duh). Der Destruktor ist Teil der internen Implementierungsdetails eines konkreten Implementierers der Schnittstelle; Es ist nicht Teil der Schnittstelle. Ich verstehe das ganze Slicing-Problem (oder zumindest denke ich, dass ich das tue)

Meine Frage ist also - ist GCC richtig, darauf zu bestehen und wenn ja, warum?

    
pm100 26.07.2010, 15:46
quelle

2 Antworten

19

Entsprechend der C ++ Spezifikation, ja.

Sie müssen den Destruktor virtuell deklarieren, sonst

%Vor%

ruft den Destruktor für die abgeleitete Klasse nicht auf (weil der Destruktor nicht in der VTable enthalten ist)

Es muss nicht-rein sein, da Basisklassen-Destruktoren immer vom Unterklassen-Destruktor aufgerufen werden.

Um weiter zu erklären, hat C ++ kein Konzept einer Schnittstelle in der gleichen Weise wie Java oder C #. Es ist nur eine Konvention, nur rein virtuelle Methoden zu verwenden und sich das als Schnittstelle vorzustellen. Die anderen Regeln über C ++ - Destruktoren machen es notwendig, dass sie nicht-rein sind, was die Ähnlichkeit mit Interfaces in anderen Sprachen bricht, aber diese Sprachen existierten zum Zeitpunkt der Erstellung dieser Regeln nicht.

    
Lou Franco 26.07.2010, 15:50
quelle
3

Wenn Sie das virtuelle Tor in der Basisklasse nicht deklarieren, führt das Löschen von Objekten abgeleiteter Klassen durch einen Zeiger auf die Basisklasse zum Aufruf des falschen Destruktors und damit zu undefiniertem Verhalten und Ressourcenverlust.

%Vor%     
Alexander Gessler 26.07.2010 15:51
quelle

Tags und Links