Heim >Backend-Entwicklung >C++ >Sollten abstrakte Basisklassen in C rein virtuelle Destruktoren haben?

Sollten abstrakte Basisklassen in C rein virtuelle Destruktoren haben?

Linda Hamilton
Linda HamiltonOriginal
2024-12-28 06:21:17859Durchsuche

Should Abstract Base Classes in C   Have Pure Virtual Destructors?

Rein virtuelle Destruktoren in C

In der Welt der objektorientierten Programmierung erfordern abstrakte Basisklassen oft rein virtuelle Destruktoren. Beim Schreiben von Code wie diesem treten jedoch Bedenken auf:

class A {
public:
    virtual ~A() = 0;
};

Dies wirft die Frage auf, ob es akzeptabel ist, dass eine abstrakte Basisklasse einen rein virtuellen Destruktor hat. Während Microsoft Visual C es ohne Probleme kompiliert, was passiert zur Laufzeit?

Die Antwort lautet: Undefiniertes Verhalten. Wenn eine Instanz einer von A abgeleiteten Klasse gelöscht oder zerstört wird, wird der Destruktor von A aufgerufen. Da es jedoch rein virtuell ist und keine Implementierung vorhanden ist, löst dies undefiniertes Verhalten aus. Auf bestimmten Plattformen kann dies dazu führen, dass der Purecall-Handler aufgerufen wird, was zu einem Absturz führt.

Um dies zu vermeiden, ist es wichtig, auch den Destruktor zu implementieren. Eine minimale Implementierung wie diese sollte ausreichen:

class A {
public:
    virtual ~A() = 0;
};

inline A::~A() { }

Auf diese Weise verursacht der Destruktor von A kein undefiniertes Verhalten, wenn Instanzen abgeleiteter Klassen gelöscht werden.

Das obige ist der detaillierte Inhalt vonSollten abstrakte Basisklassen in C rein virtuelle Destruktoren haben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn