Rein virtueller Destruktor in C ++
-
08-07-2019 - |
Frage
Ist es falsch zu schreiben:
class A {
public:
virtual ~A() = 0;
};
für eine abstrakte Basisklasse?
Zumindest in MSVC kompiliert ... Wird es während der Laufzeit zum Absturz bringen?
Lösung
Ja. Sie müssen auch den destructor implementieren:
class A {
public:
virtual ~A() = 0;
};
inline A::~A() { }
sollte ausreichen.
Und da dies eine nach unten Abstimmung kam, soll ich klarstellen: Wenn Sie alles von A ableiten und dann versuchen, sie zu löschen oder zu zerstören, Destruktor A
wird schließlich aufgerufen werden. Da es rein und hat keine Implementierung wird nicht definiertes Verhalten ergeben. Auf einer beliebten Plattform, dass die purecall Handler und Absturz aufrufen.
Edit: die Erklärung zur Festsetzung seines konformen, zusammengestellt mit http://www.comeaucomputing.com/tryitout /
Andere Tipps
Privat Destruktoren: sie erhalten Sie einen Fehler geben, wenn Sie ein Objekt einer abgeleiteten Klasse erstellen - sonst nicht. Diagnostisches kann allerdings erscheinen.
12.4 Destructors
6 A destructor virtuell (10.3) bzw. rein virtuelle (10.4) deklariert werden; wenn alle Objekte dieser Klasse oder einer abgeleiteten Klasse werden im Programm erstellt, so wird die destructor definiert werden.
A-Klasse mit einem rein virtuellen Destruktor ist eine abstrakte Klasse. Beachten Sie auch:
10.4 Abstrakte Klassen
2 Eine reine virtuelle Funktion braucht nur, wenn mit genannt definiert werden, oder als ob mit (12.4), der qualifizierte-ID-Syntax (5.1).
[ Hinweis : eine Funktionsdeklaration können nicht beide bieten einen reinen Spezifizierer und eine Definition -Ende Anmerkung]
Genommen gerade aus dem Entwurf:
struct C {
virtual void f() = 0 { }; // ill-formed
};