Virtuelle Destruktoren
-
Hi Leute!
Ich schreibe schon seit einiger Zeit an einem Framework.
Mich drängt die Frage, ob ich nicht vieleicht jeden Desktruktor virtuell machen sollte.
Einige Klassen werden abgeleitet, andere vieleicht später.Hat es generell Nachteile einen Destuktor virtuell zu deklarieren? Außer mehr Speicherbedarf, da der Header um ganze 8 Zeichen größer wird.

Ich lege nehmlich viel Wert auf Performance und da ich gehört habe, dass es mit virtuellen Methoden schon so einige Probleme gibt, dachte ich es könnte mit virtuellen Destruktoren auch so werden.Sonst würde ich auf Nummer Sicher gehen und alle Desktruktoren virtuell machen.
Was sagen die Experten?
-
Blaze schrieb:
Hat es generell Nachteile einen Destuktor virtuell zu deklarieren?
Sobald eine Klasse mindestens eine virtuelle Methode enthält, wird sie polymorph. Das heisst, sie erhält eine VTable mit Funktionszeigern, was einen leichten Overhead bezüglich Speicherverbrauch und Geschwindigkeit (z.B. beim Kopieren, Korrekt Initialisieren) darstellt.
Blaze schrieb:
Ich schreibe schon seit einiger Zeit an einem Framework.
Mich drängt die Frage, ob ich nicht vieleicht jeden Desktruktor virtuell machen sollte.Nein, tu das auf gar keinen Fall!
Blaze schrieb:
Einige Klassen werden abgeleitet, andere vieleicht später.
Du wirst noch genügend Gelegenheit haben, virtuelle Funktionen einzubauen, falls sie nötig sind. Und das ist nicht zwingend ab dem Punkt, wo Vererbung ins Spiel kommt. Vererbung impliziert Polymorphie nicht!
-
Destuktoren sind immer dann virtuell zu machen, wenn von der Klasse abgeleitet werden können soll. Wenn es sich um Klassen handelt, die nicht abgeleitet werden soll, dann wird der Destruktor nicht virtuell gemacht.
-
Du solltest einen virtuellen Destruktor dort einsetzen, wo du ihn brauchst. Mir scheint so, als wüsstest du nicht recht, wann du einen brauchst.
Ganz einfach. Wenn du eine abgeleitete Klasse mit einem Zeiger auf eine Basisklasse zerstören möchtest (also ohne den genauen Typ zu kennen), dann brauchst du einen. Ansonsten nicht.
Wie ich in der Vorschau sehe, hat Nexus ja schon gesagt, dass man Vererbung durchaus ohne virtuelle Methoden, respektive Polymorphie benutzen kann. (Siehe z.B Standardbibliothek).
-
Raymond schrieb:
Destuktoren sind immer dann virtuell zu machen, wenn von der Klasse abgeleitet werden können soll. Wenn es sich um Klassen handelt, die nicht abgeleitet werden soll, dann wird der Destruktor nicht virtuell gemacht.
Wie gesagt, Vererbung kann auch ohne dynamische Polymorphie verwendet werden und wird das auch oft. Virtuelle Funktionen sind nur nötig, wenn man über Zeiger oder Referenzen auf Basisklassenobjekte erreichen möchte, dass die dynamischen Typen dahinter (meist Instanzen von abgeleiteten Klassen) ihre klassen-spezifische Aktion durchführen. Das alles bei gemeinsamer Schnittstelle in der Basisklasse, sodass man als Benutzer keine explizite Typunterscheidung durchführen muss und eine Abstraktionsmöglichkeit erhält.
-
Ich bin zwar keine Experte :xmas2: aber ich sage dir folgendes:
Performance ist nicht unbedingt das allererste, was man bei GUIs beachten sollte. Die Bereiche, in denen der sogenannte Overhead von virtuellen Funktionen zu viel wird, sind in C++ zwar nicht selten, aber in den meisten Projekten nicht von belangen. Virtuelle Funktionen belegen nicht nur Speicher im Sourcecode, sondern zu deiner Klasse kommt ein Zeiger (auf 32-Bit 4 Bytes) pro Objekt hinzu + (bei den allermeisten Compilern) ein Array aus Funktionszeigern. Das sind die Kosten der Laufzeitpolymorphie.
Wenn du auf Vererbungshierachien setzt, ist das kein Problem und sogar notwendig. Beachte aber, dass du nur wirklich den Klassen einen virtuellen Destruktor gibst, von denen auch vererbt werden soll. Willst du, das eine (Sub-)Klasse nicht als Basisklasse weiterer Hierachien dient, ist die Benutzung von Nicht-virtuellen Destruktoren ein guter Weg.
-
Ad aCTa schrieb:
Das sind die Kosten der Laufzeitpolymorphie.
Wenn du auf Vererbungshierachien setzt, ist das kein Problem und sogar notwendig. Beachte aber, dass du nur wirklich den Klassen einen virtuellen Destruktor gibst, von denen auch vererbt werden soll.Grr. Lies mal meine beiden Posts. :p
-
Wer hat was von GUI gesagt?
Wenn du auf Vererbungshierachien setzt, ist das kein Problem und sogar notwendig. Beachte aber, dass du nur wirklich den Klassen einen virtuellen Destruktor gibst, von denen auch vererbt werden soll. Willst du, das eine (Sub-)Klasse nicht als Basisklasse weiterer Hierachien dient, ist die Benutzung von Nicht-virtuellen Destruktoren ein guter Weg.
Wie schon gesagt. Vererbung heisst nicht auch gleich, dass man Polymorphie und irgendwelche virtuellen Funktionen benutzen muss!
EDIT:
Die Gesschwindigkeit, mit der wir hier posten fördert die Redundanz. :p
-
Danke erstmal für Eure zahlreichen und schnellen Meinungen!
Ich werde dann mal individuell anpassen.
Frohe Weihnachten Euch allen! :xmas1: