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