Gibt es eine Verwendung für die Herstellung einer geschützten virtuellen Destruktor?
/*Child is inherited from Parent*/
class Parent {
public:
Parent () //Constructor
{
cout << "\n Parent constructor called\n" << endl;
}
protected:
~Parent() //Dtor
{
cout << "\n Parent destructor called\n" << endl;
}
};
class Child : public Parent
{
public:
Child () //Ctor
{
cout << "\nChild constructor called\n" << endl;
}
~Child() //dtor
{
cout << "\nChild destructor called\n" << endl;
}
};
int main ()
{
Parent * p2 = new Child;
delete p2;
return 0;
}
Wenn ich Parent
's Destruktor virtual, dann besorge ich einen Fehler, so was ist der Zweck der Herstellung einer geschützten virtuellen Destruktor?
- Vielleicht sollten wir anfangen mit "warum würden Sie machen dtor geschützt?".
- Warum haben Sie jemals wollen, um den virtuellen Destruktor? Sollten Sie nicht wissen, den Zweck? Eine protected-Destruktor bedeutet, dass Objekte, die sollte nicht zerstört werden durch die base-Pointer, also den code in
main
ist schlicht falsch. - Siehe stackoverflow.com/questions/461203/...
- Ich verstehe die Verwendung von virtuellen dtors und die Nutzung des geschützten dtors, aber ich sah einige code mit geschützten virtuellen dtors. Was ich nicht verstanden habe war, wenn beide benutzt werden, was für eine Wirkung wird es erzeugt?
- durch dtors geschützt werden Sie verhindern, dass die Bildung der Basis-Klasse-Objekte auf den stack. am i rite?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur ein Beispiel zu geben: angenommen, Sie haben eine Basis-Klasse implementiert die Referenz zählen. Sie haben eine
addRef
und einrelease
Methode und das Objekt zerstört werden, wenn (und nur wenn) der interne Zähler null erreicht durch einen Aufrufrelease
.Also, Sie wollen, dass Ihr Destruktor geschützt werden (da Sie nur wollen, um das Objekt zu zerstören innerhalb
relase
).Wenn Sie planen, leiten sich von der Klasse haben, können Sie auch wollen, um Ihre virtuellen Destruktor, da müssen Sie einen virtuellen Destruktor, wenn Sie wollen, zerstören Sie ein Kind-Objekt über einen Zeiger auf eine Basisklasse (danke @sharptooth für den Hinweis ...)
Ja, wenn Sie zu tun beabsichtigen
delete this
imclass Parent
member-Funktionen, die sehr Häufig bei der UmsetzungIUnknown::Release()
in COM-Objekte.depete pBase;
attampted.Gibt es ein Eintrag in die C++ - Kern-Richtlinien widmet sich diesem spezifischen Thema:
So, der Destruktor muss nicht virtuell sein, wenn es geschützt ist. Es gibt jedoch eine Ausnahme:
Also, um zusammenzufassen, ist in der Praxis eine protected-Destruktor muss nicht virtuell sein.
protected: Base::~Base();
sollte virtuell sein, zumindest dann, wenn Sie (planen) löschen von Objekten, die vonBase
innerhalbBase
oder eine abgeleitete Klasse vonBase
.