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?
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.
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%Tags und Links c++ virtual-destructor