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?

War es hilfreich?

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
};
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top