2009-03-10 15 views
136

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?

+7

Es kompiliert, aber Verbindet es? –

Antwort

182

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/

+0

Also sollte es virtuell erklärt werden ~ A() {}, ohne die "= 0". Es ist nicht rein virtuell, wenn Sie eine Implementierung bereitstellen – jalf

+15

Ähm, ja ist es. Pure bedeutet nur, dass eine abgeleitete Klasse auch eine Implementierung bereitstellen muss. – MSN

+65

Die Implementierung reiner virtueller Funktionen ist in der Tat legal. Sehr nützlich, um eine Standardimplementierung bereitzustellen, aber Unterklassen zwingen, sie explizit aufzurufen. – jmucchiello

45

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 
}; 
+11

+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. –

+6

Ja, es ist etwas, was du in einem Interview machst, um deine Interviewer zu nerven;) – dirkgently

+1

Es ist tatsächlich nicht so ungewöhnlich, nach meiner Erfahrung. –

Verwandte Themen