capypad
0 Tage Serie
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
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.