Gibt es eine Möglichkeit, einen geschützten Destruktor virtuell zu machen?

8
%Vor%

Wenn ich% destructor Parent virtuell mache, erhalte ich einen Fehler, also was ist der Zweck, einen geschützten Destruktor virtuell zu machen?

    
tusharfloyd 23.01.2012, 10:51
quelle

3 Antworten

17

Um nur ein Beispiel zu nennen: Nehmen wir an, Sie haben eine Basisklasse, die die Referenzzählung implementiert. Sie haben eine addRef und eine release Methode und möchten, dass Ihr Objekt zerstört wird, wenn (und nur if) der interne Zähler Null erreicht durch einen Aufruf von release .

Also, zuerst wollen Sie Ihren Destruktor geschützt (da Sie nur das Objekt aus relase zerstören wollen).

Wenn Sie beabsichtigen, von Ihrer Klasse abzuleiten, möchten Sie auch, dass Ihr Destruktor virtuell ist, da Sie einen virtuellen Destruktor immer dann brauchen, wenn Sie ein untergeordnetes Objekt durch einen Zeiger auf eine Basisklasse zerstören wollen (danke @sharptooth für den Hinweis). ..)

    
MartinStettner 23.01.2012, 11:12
quelle
5

Ja, wenn Sie delete this in class Parent member-Funktionen ausführen möchten, was sehr häufig bei der Implementierung von IUnknown::Release() in COM-Objekten ist.

    
sharptooth 23.01.2012 11:09
quelle
4

protected: Base::~Base(); sollte mindestens virtuell sein, wenn Sie Objekte löschen möchten, die von Base in Base oder einer abgeleiteten Klasse von Base abgeleitet sind.

    
bitmask 23.01.2012 11:06
quelle