Virtual destructor



  • Hallo,

    nur mal eine theoretische Frage.
    Muss ich bei Vererbung auch einen virtual Destruktor haben, wenn in der
    vererbende Klasse keine weiteren class member deklariert werden?
    Dann muss ja (eigentlich) nur ein Speicherbereich wie beim Basisobjekt
    zerstört werden, da der abgeleitete Destruktor eh nichts macht.

    Gruß,
    Virtualisator



  • ISO/IEC 14882 5.3.5/3 schrieb:

    In the first alternative (delete object), if the static type of the operand is different from its dynamic type, the
    static type shall be a base class of the operand’s dynamic type and the static type shall have a virtual
    destructor or the behavior is undefined.

    Auch wenn es logisch nicht unbedingt sein müsste, ist es vorgegeben, dass er notwendig ist. Ansonsten ist das Verhalten undefiniert.



  • nachrichtentext



  • Torboe schrieb:

    da hätt ich doch auch mal eine theoretische frage dazu:
    angenommen ich habe:
    - eine basisklasse A (klasseneigenschaften zb. char* feld)
    - eine von A abgeleitete klasse B (klasseneigenschaften zb int zahl)
    - eine von B abgeleitete klasse C (klasseneigenschaften zb char* feld2)

    muss ich jetzt in B den destruktor auch virtuell machen? obwohlich gar keinen bräuchte, da eh der implizite destruktor aufgerufen wird? ich habe gelesen: einmal virtuell - immer virtuell.

    Du mußt den Destruktor von A virtuell machen, indem du "virtual" davor schreibst. Sollte A noch keinen Destruktor haben, schreibst du eben einen leeren:
    virtual ~A() { }

    Alle von A abgeleiteten Klassen kriegen von Compiler automatisch virtuelle Destruktoren, egal wie (oder ob) du sie hinschreibst. Das "virtual" kannst du der Übersicht halber hinschreiben, mußt du aber nicht (das selbe gilt auch für andere in der Basisklasse virtuelle Funktionen).


Anmelden zum Antworten