Wann darf eine Klasse abgeleitet werden?

Hallo,

Hier ist meinen Beispiel

class BasisKlasse
{
public:
BasisKlasse(){}
~BasisKlasse(){} // muss „virtual“ vor den Destruktor stehen?
};

class AbgeleitetKlasse: public Basisklasse
{
AbgeleitetKlasse(){}
~AbgeleitetKlasse(){}
}

Frage:
Darf man eine Klasse ableitet wenn sein Destruktok nicht virtual deklariert ist?

Danke

Hi,

Darf man eine Klasse ableitet wenn sein Destruktok nicht
virtual deklariert ist?

Aber ja doch ! You ask for it, you get it …

Dir sollte aber klar sein, was es heisst, einen nicht
virtuellen Destructor zu haben.

Gruss
norsemanna

Warum darf man es nicht? Könnte später im Programm sehr böse Fehler auftreten?

Warum darf man es nicht? Könnte später im Programm sehr böse
Fehler auftreten?

Ja, unter bestimmten Umständen.

Sei B die Basisklasse und D die abgeleitete Klasse („derived“). Folgender Code ist ohne Probleme:

void funktion()
{
B* b = new B();
D* d = new D();

delete b;
delete d;
}

Am Ende der Funktion werden - jeweils passend - die Destruktoren von b und d aufgerufen. Der nächste Code hat ein Problem:

void funktion()
{
B* d_als_b = new D();
delete d_als_b;
}

Da D von B abgeleitet ist, kann ich es auch als Objekt der Mutterklasse ansehen („Polymorphie“). Aber am Ende wird nun der Destruktor für ein B-Objekt ausgeführt, obwohl es sich tatsächlich um ein D handelt. Der Compiler weiß es nicht besser, denn er kennt nur den Destruktor des statischen Typs B. Um anhand des Laufzeittyps D den Destruktor wählen zu können, muss er virtuell sein.

Wenn ein B-Destruktor auf einem D-Objekt läuft, kann alles mögliche schiefgehen - schließlich belegt D potentiell mehr Speicher als B und hat womöglich ganz andere freizugebende Ressourcen als B.

Viele Grüße,
Sebastian

Danke Sebastien für die Informationen.