Definieren rein virtueller Destruktoren in C: Enthüllung der Fallstricke
Das Konzept rein virtueller Destruktoren in C wirft wichtige Fragen hinsichtlich der korrekten Implementierung für auf abstrakte Basisklassen. Betrachten Sie den folgenden Codeausschnitt:
class A { public: virtual ~A() = 0; };
Es stellt sich die Frage, ob dieser Ansatz für die Definition einer abstrakten Basisklasse geeignet ist. Obwohl es in MSVC erfolgreich kompiliert wird, bestehen Bedenken, dass es zu Laufzeitabstürzen kommen könnte.
Enthüllung des Problems
Das Problem ergibt sich aus der fehlenden Implementierung für das reine Virtuelle Zerstörer. Wenn abgeleitete Klassen von A erstellt werden, rufen ihre Destruktoren schließlich den Destruktor von A auf. Da der Destruktor von A jedoch rein ist, führt der Aufruf zu undefiniertem Verhalten.
Behebung der Gefahr
Um diesen Laufzeitabsturz zu vermeiden, ist es wichtig, den Destruktor zu implementieren in der Basisklasse selbst. Eine einfache Inline-Implementierung, wie unten gezeigt, reicht aus:
class A { public: virtual ~A() = 0; }; inline A::~A() { }
Diese Implementierung stellt sicher, dass beim Löschen oder Zerstören einer abgeleiteten Klasse der Destruktor von A aufgerufen wird und das Programm sich wie erwartet verhält.
Das obige ist der detaillierte Inhalt vonSollten reine virtuelle Destruktoren in C definiert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!