Est-ce mal d'écrire:
class A {
public:
virtual ~A() = 0;
};
pour une classe de base abstraite?
Au moins cela compile dans MSVC ... Est-ce que ça plantera au moment de l'exécution?
Est-ce mal d'écrire:
class A {
public:
virtual ~A() = 0;
};
pour une classe de base abstraite?
Au moins cela compile dans MSVC ... Est-ce que ça plantera au moment de l'exécution?
Réponses:
Oui. Vous devez également implémenter le destructeur:
class A {
public:
virtual ~A() = 0;
};
inline A::~A() { }
devrait suffire.
Et comme cela a obtenu un vote défavorable, je devrais clarifier: si vous dérivez quelque chose de A et essayez ensuite de le supprimer ou de le détruire, A
le destructeur de s sera finalement appelé. Puisqu'il est pur et n'a pas d'implémentation, un comportement indéfini s'ensuivra. Sur une plate-forme populaire, cela invoquera le gestionnaire purecall et plantera.
Edit: correction de la déclaration pour qu'elle soit plus conforme, compilée avec http://www.comeaucomputing.com/tryitout/
Destructeurs privés: ils vous donneront une erreur lorsque vous créez un objet d'une classe dérivée - pas autrement. Un diagnostic peut cependant apparaître.
12.4 Destructeurs
6 Un destructeur peut être déclaré virtuel (10.3) ou pur virtuel (10.4); si des objets de cette classe ou de toute classe dérivée sont créés dans le programme, le destructeur doit être défini.
Une classe avec un destructeur virtuel pur est une classe abstraite. Note bien:
10.4 Classes abstraites
2 Une fonction virtuelle pure n'a besoin d'être définie que si elle est appelée avec, ou comme si avec (12.4), la syntaxe d'ID qualifié (5.1).
[ Remarque : une déclaration de fonction ne peut pas fournir à la fois un spécificateur pur et une définition - note de fin]
Tiré directement du brouillon:
struct C {
virtual void f() = 0 { }; // ill-formed
};