Virtuelle Destruktoren



  • Hallo zusammen. Ich habe eine Frage zu den virtuellen Destruktoren.
    In meinem C++ Buch steht die Faustregel, das wenn virtuelle Methoden vorhanden sind, auch ein virtueller Destruktor implementiert werden sollte.
    z.B:

    class Circle : public Shape
    {
    public:
        virtual ~Circle() {}
        virtual void Info() const;
    };
    

    Da ich nun in der Klasse Circle keine Variablen habe, muss ich hier trotzdem einen Konstruktor implementieren?
    Denn bisher habe ich es immer so gemacht, wo ein Konstruktor ist, brauchts einen Destruktor. Aber hier wäre es nicht nötig. Einen Compilerfehler gibts nicht. Kann ich also den Konstruktor beiseite lassen?

    Vielen Dank



  • Ein destruktor ist dazu da, um bei zerstören des Objektes aufgerufen zu werden, der dann z.B. mit new beschafften Speicherplatz freigibt. Ein Konstruktor ist dazu da um die Elemente zu initialisieren, zerstört(ihr destruktor wird aufgerufen) werden sie wenn das Objekt zerstört wird. In deinem Fall würde ich weder keinen virtuellen destruktor einbauen. (Was soll das? Du würdest ja nichtmal einen normalen destruktor definieren?)
    /edit: ich meinte natürlich definieren...



  • virtuelle destruktor ist dann gut wenn du klassen von der klasse ableitest
    und fallst du in den abgeleiteten Klassen keinen destruktor definierst wir automatisch der von der basisklasse genommen



  • Wenn du eine Klasse polymorph benutzt und über einen Basisklassenzeiger deletest, MUSS ein virtueller Destruktor vorhanden sein. Sonst ist das Verhalten undefiniert.

    ness schrieb:

    In deinem Fall würde ich weder keinen virtuellen destruktor einbauen. (Was soll das? Du würdest ja nichtmal einen normalen destruktor aufrufen?)

    Jede Klasse hat einen Destruktor. Wenn du keinen definierst, tut der Compiler das für dich.



  • Danke, das habe ich mir auch gedacht. Aber in meinem Buch stand eben, das man einfach überall dort, wo eine virtuelle Methoden ist, einen virtuellen Destruktor implementieren sollte.

    Aber darum gibts ja Foren 🙂
    Grüsse



  • Das ist eine sinnvolle Faustregel. Denn normalerweise wird man nur dann virtuelle Methoden schreiben, wenn man die Klasse polymorph einsetzen will. Und ziemlich oft wird man sie auch polymorph zerstören wollen.



  • Puh, gut so. Denn bis jetzt habe ich in all meinen Programmen diese Regel benutzt. Denn sie ist ja auch einleuchtend.
    Aber sollte ich jetzt den Konstruktor implementieren oder nicht?



  • Wenn du ihn nicht brauchst, um irgendwelche Variablen zu initialisieren: nein. Aber ich kenne kaum eine Klasse die irgendwas im Konstruktor zu tun hat.



  • KPC schrieb:

    Aber ich kenne kaum eine Klasse die irgendwas im Konstruktor zu
    tun hat.

    Wie? Fallen deine Invarianten alle vom Himmel? Oder fehlt da ein "nicht"?



  • Nun ja, mir fällt grad was ein, ich würde den destruktor doch virtuell machen:
    Eventuell willst du ja mal noch spezielle Kreise von deinem Kreis ableiten, die eventuell einen eigenen destruktor haben wollen. Wenn du sie aber dann polymorph benutzt, werden diese nie aufgerufen (stimmt doch, oder [effective c++, item 37]).



  • ness schrieb:

    Wenn du sie aber dann polymorph benutzt, werden diese nie aufgerufen (stimmt doch, oder [effective c++, item 37]).

    Stimmt, wird nicht aufgerufen.
    wenn man den g++ mit der -Weffc++ -option aufruft gibt es aber wenigstens noch eine warnung.

    mfg


Anmelden zum Antworten