Ist es falsch zu schreiben:
class A {
public:
virtual ~A() = 0;
};
für eine abstrakte Basisklasse?
Zumindest wird das in MSVC kompiliert ... Wird es zur Laufzeit abstürzen?
Ist es falsch zu schreiben:
class A {
public:
virtual ~A() = 0;
};
für eine abstrakte Basisklasse?
Zumindest wird das in MSVC kompiliert ... Wird es zur Laufzeit abstürzen?
Antworten:
Ja. Sie müssen auch den Destruktor implementieren:
class A {
public:
virtual ~A() = 0;
};
inline A::~A() { }
sollte ausreichen.
Und da dies eine negative Abstimmung erhielt, sollte ich klarstellen: Wenn Sie etwas von A ableiten und dann versuchen, es zu löschen oder zu zerstören, wird A
der Destruktor schließlich aufgerufen. Da es rein ist und keine Implementierung hat, kommt es zu undefiniertem Verhalten. Auf einer beliebten Plattform wird der Purecall-Handler aufgerufen und stürzt ab.
Bearbeiten: Korrektur der Konformität der Erklärung, zusammengestellt mit http://www.comeaucomputing.com/tryitout/
Private Destruktoren: Sie geben einen Fehler aus, wenn Sie ein Objekt einer abgeleiteten Klasse erstellen - nicht anders. Möglicherweise wird jedoch eine Diagnose angezeigt.
12.4 Destruktoren
6 Ein Destruktor kann als virtuell (10.3) oder rein virtuell (10.4) deklariert werden. Wenn Objekte dieser Klasse oder eine abgeleitete Klasse im Programm erstellt werden, muss der Destruktor definiert werden.
Eine Klasse mit einem reinen virtuellen Destruktor ist eine abstrakte Klasse. Beachten Sie gut:
10.4 Abstrakte Klassen
2 Eine reine virtuelle Funktion muss nur definiert werden, wenn sie mit oder wie mit (12.4) der Syntax der qualifizierten ID (5.1) aufgerufen wird.
[ Anmerkung : Eine Funktionsdeklaration kann nicht sowohl einen reinen Spezifizierer als auch eine Definition enthalten.
Direkt aus dem Entwurf entnommen:
struct C {
virtual void f() = 0 { }; // ill-formed
};