cpp / intermediate
Snippet
Virtuelle Destruktoren bei Vererbung
Wenn man in C++ ein Objekt einer abgeleiteten Klasse über einen Basisklassen-Zeiger löscht, ist das Verhalten undefiniert, sofern die Basisklasse keinen virtuellen Destruktor hat. Das Schlüsselwort 'virtual' garantiert die korrekte Bereinigung der gesamten Hierarchie.
snippet.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Base {public:virtual ~Base() { /* Cleanup base */ }};class Derived : public Base {int* data;public:Derived() { data = new int[10]; }~Derived() override { delete[] data; }};void cleanup() {Base* ptr = new Derived();delete ptr; // Calls Derived destructor because Base destructor is virtual}
Erklärung
1
virtual ~Base()
Deklariert den Destruktor als virtuell, was eine polymorphe Bereinigung über Zeiger ermöglicht.
2
~Derived() override
Liefert die spezifische Bereinigungslogik für die abgeleitete Klasse und überschreibt den Basis-Destruktor.