virtual ~Destruktor



  • Hallo,

    wann/muss sollte man den Destruktor virtual machen?



  • das steht in der betriebsanleitung von c++



  • Wäre ein gutes Thema für die FAQ...
    Nur mal so nebenbei bemerkt...



  • Fausregel: Wenn eine Memberfunktion virtuell ist, dann ist der Destruktor auch virtuell.



  • Fausregel die Zweite: Fausregel immer mit 't' schreiben.



  • Original erstellt von Daniel E.:
    Fausregel: Wenn eine Memberfunktion virtuell ist, dann ist der Destruktor auch virtuell.

    aha...
    also, wenn ich irgendeine Funktion der Klasse virtuell mache, sollte diese Klasse dann auch einen virtuellen Destructor haben!?!

    Scheint simple zu sein! 😉 Danke erstmal.



  • Fausregel die Dritte: Für die ausführliche von so Sachen Variante(Achtung: Wort ist 3 Plätze zu spät) Meyers lesen.



  • Fausregel die Dritte: Für die ausführliche von so Sachen Variante(Achtung: Wort ist 3 Plätze zu spät) Meyers lesen.

    Und nach dem Meyers lesen, Sutter nicht vergessen 🙂
    Ein Blick auf www.gotw.ca lohnt sich immer: http://www.gotw.ca/publications/mill18.htm



  • Ergenzung zu den Fausregeln:
    Wenn eine Member-Funktion "virtual" ist, bedeutet dies eigentlich immer, dass mon von dieser Klasse nochmal ableiten wird, sonst kann man sich das "virtual" auch sparen.
    Aber der springende Punkt für einen virtuellen Distruktor ist der, dass die Distruktoren der Abgeleiteten bis schliesslich der der Basisklasse alle nacheinander beim löschen des Objekts abgearbeitet werden. Und dies ist normalerweise genau das, was man möchte. Andernfalls würde nur der Distruktor der Klasse aufgerufen werden, von dem der "delete" übergebene Zeiger auch Typ von ist.
    Da zum ableiten einer Klasse allerdings virtuelle Memberfunktion nicht zwingend notwendig sind, würde ich die Faustregel 1 anders formulieren.
    Soll von der Klasse später nochmal abgeleitet werden können, dann mach den Distruktor virtual. Und bist Du Dir nicht sicher, dann mach ihn besser auch virtual, denn dieser eine "hop" des Aufrufs über die "virtual-table" kostet "keine" Performance.



  • Original erstellt von wischmop2:
    Da zum ableiten einer Klasse allerdings virtuelle Memberfunktion nicht zwingend notwendig sind, würde ich die Faustregel 1 anders formulieren.
    Soll von der Klasse später nochmal abgeleitet werden können, dann mach den Distruktor virtual. Und bist Du Dir nicht sicher, dann mach ihn besser auch virtual, denn dieser eine "hop" des Aufrufs über die "virtual-table" kostet "keine" Performance.

    Ja. Guter Ansatz. Es muß schon irgendwie bestimmen sein, welche Fehler die Kollegen anstellen würden.
    Aber irgendwo muß man aufhören, da es nicht so einfach ist, das Erben zu verbieten. Und wenn jeder dumm rumerben kann, müßte irgendwie gleich alles virtual sein. Nee, wenn mein struct Vector3d{int x,y,z;...}; (für das ct-puzzle) nen v-dtor kriegt, kann ich gleich aufhören.



  • Nee, wenn mein struct Vector3d{int x,y,z;...}; (für das ct-puzzle) nen v-dtor kriegt, kann ich gleich aufhören.
    

    Ursprünglich wollte ich auch mitmachen, hab dann aber nie Zeit gefunden 😞


Anmelden zum Antworten