Ist es falsch zu schreiben:rein virtueller Destruktor in C++
class A {
public:
virtual ~A() = 0;
};
für eine abstrakte Basisklasse?
Zumindest das kompiliert in MSVC ... Wird es zur Laufzeit abstürzen?
Ist es falsch zu schreiben:rein virtueller Destruktor in C++
class A {
public:
virtual ~A() = 0;
};
für eine abstrakte Basisklasse?
Zumindest das kompiliert in MSVC ... Wird es zur Laufzeit abstürzen?
Ja. Sie müssen auch den Destruktor implementieren:
class A {
public:
virtual ~A() = 0;
};
inline A::~A() { }
sollte ausreichen.
Und da dies eine Down-Abstimmung bekam, sollte ich klarstellen: Wenn Sie irgendetwas von A ableiten und dann versuchen, es zu löschen oder zu zerstören, wird schließlich der Destruktor A
aufgerufen. Da es rein ist und keine Implementierung hat, wird ein undefiniertes Verhalten folgen. Auf einer populären Plattform wird der purecall-Handler aufgerufen und abgestürzt.
Edit: die Erklärung zur Festsetzung seines konformen, zusammengestellt mit http://www.comeaucomputing.com/tryitout/
Also sollte es virtuell erklärt werden ~ A() {}, ohne die "= 0". Es ist nicht rein virtuell, wenn Sie eine Implementierung bereitstellen – jalf
Ähm, ja ist es. Pure bedeutet nur, dass eine abgeleitete Klasse auch eine Implementierung bereitstellen muss. – MSN
Die Implementierung reiner virtueller Funktionen ist in der Tat legal. Sehr nützlich, um eine Standardimplementierung bereitzustellen, aber Unterklassen zwingen, sie explizit aufzurufen. – jmucchiello
Privat Destruktoren: sie geben Ihnen einen Fehler, wenn Sie ein Objekt einer abgeleiteten Klasse erstellen - sonst nicht. Eine Diagnose kann jedoch erscheinen.
12,4 Destruktoren
6 A destructor virtuelle virtuelle (10.3) oder reine deklariert werden kann (10.4); Wenn im Programm Objekte dieser Klasse oder einer abgeleiteten Klasse erstellt werden, muss der Destruktor definiert werden.
Eine Klasse mit einem reinen virtuellen Destruktor ist eine abstrakte Klasse. Note gut:
10,4 Abstrakte Klassen
2 Eine rein virtuelle Funktion braucht nur aufgerufen definiert werden, wenn mit, oder als ob mit (12.4), der qualifizierte-ID Syntax (5.1).
[Hinweis: eine Funktionsdeklaration sowohl einen reinen Spezifizierer und eine Definition nicht zur Verfügung stellen kann -Ende note]
gerade aus dem Entwurf genommen:
struct C {
virtual void f() = 0 { }; // ill-formed
};
+1. Ich denke, Herb Sutter hat auch einige gute Infos dazu: http://www.gotw.ca/gotw/031.htm. Es ist interessant festzustellen, dass für jede reine virtuelle Funktion eine Implementierung bereitgestellt werden kann, nicht nur für Destruktoren. –
Ja, es ist etwas, was du in einem Interview machst, um deine Interviewer zu nerven;) – dirkgently
Es ist tatsächlich nicht so ungewöhnlich, nach meiner Erfahrung. –
Es kompiliert, aber Verbindet es? –