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!