109 Stimmen

Wann sollten Sie keine virtuellen Destruktoren verwenden?

Gibt es jemals einen guten Grund für pas einen virtuellen Destruktor für eine Klasse deklarieren? Wann sollten Sie es ausdrücklich vermeiden, einen zu schreiben?

0voto

icecrime Punkte 70619

Eine Operation, die an der Basisklasse durchgeführt wird und die sich virtuell verhalten soll, sollte virtuell sein. Wenn die Löschung polymorph über die Schnittstelle der Basisklasse erfolgen kann, muss sie sich virtuell verhalten und virtuell sein.

Der Destruktor muss nicht virtuell sein, wenn Sie nicht beabsichtigen, von der Klasse abzuleiten. Und selbst wenn Sie das tun, ein geschützter nicht-virtueller Destruktor ist genauso gut, wenn das Löschen von Zeigern der Basisklasse nicht erforderlich ist .

-8voto

Windows programmer Punkte 7727

Die Antwort auf die Frage nach der Leistung ist die einzige, die ich kenne, die eine Chance hat, wahr zu sein. Wenn Sie gemessen und festgestellt haben, dass die De-Virtualisierung Ihrer Destruktoren die Dinge wirklich beschleunigt, dann haben Sie wahrscheinlich auch andere Dinge in dieser Klasse, die beschleunigt werden müssen, aber an diesem Punkt gibt es wichtigere Überlegungen. Eines Tages wird jemand entdecken, dass Ihr Code eine schöne Basisklasse für ihn darstellt und ihm eine Woche Arbeit erspart. Sie sollten dafür sorgen, dass derjenige die Arbeit dieser Woche erledigt, indem er Ihren Code kopiert und einfügt, anstatt Ihren Code als Grundlage zu verwenden. Sorgen Sie lieber dafür, dass Sie einige Ihrer wichtigen Methoden privat machen, damit niemand von Ihnen erben kann.

0 Stimmen

Polymorphismus wird die Dinge sicherlich verlangsamen. Vergleichen Sie das mit einer Situation, in der wir Polymorphismus brauchen und uns dafür entscheiden, es nicht zu tun, dann wird es sogar noch langsamer sein. Beispiel: Wir implementieren die gesamte Logik im Destruktor der Basisklasse und verwenden RTTI und eine Switch-Anweisung, um die Ressourcen aufzuräumen.

2 Stimmen

In C++ ist es nicht Ihre Aufgabe, mich daran zu hindern, von Ihren Klassen zu erben, von denen Sie dokumentiert haben, dass sie nicht als Basisklassen geeignet sind. Es liegt in meiner Verantwortung, die Vererbung mit Bedacht einzusetzen. Es sei denn, der hauseigene Styleguide sagt etwas anderes, natürlich.

1 Stimmen

... nur den Destruktor virtuell zu machen, bedeutet nicht, dass die Klasse notwendigerweise korrekt als Basisklasse funktionieren wird. Ihn als virtuell zu markieren, "nur weil", anstatt diese Einschätzung vorzunehmen, ist also ein Scheck, den mein Code nicht einlösen kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X