Destructeur virtuel pur en C ++

Est-ce faux d’écrire:

class A { public: virtual ~A() = 0; }; 

pour une classe de base abstraite?

Au moins cela comstack dans MSVC … Est-ce qu’il va planter au moment de l’exécution?

Oui. Vous devez également implémenter le destructeur:

 class A { public: virtual ~A() = 0; }; inline A::~A() { } 

devrait suffire.

Et puisque cela a un vote faible, je devrais préciser: si vous dérivez quelque chose de A et que vous essayez ensuite de le supprimer ou de le détruire, le destructeur de A sera éventuellement appelé. Comme 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 le crash.

Edit: fixer la déclaration pour être plus conforme, compilée avec http://www.comeaucomputing.com/tryitout/

Destructeurs privés: ils vous donneront une erreur lorsque vous créez un object 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 virtuel pur (10.4); si des objects 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 doit être définie uniquement si elle est appelée avec, ou comme si (12.4), la syntaxe de l’identificateur qualifié (5.1).

[ Remarque : une déclaration de fonction ne peut pas fournir à la fois un spécificateur pur et une définition – note finale]

Tiré directement du brouillon:

 struct C { virtual void f() = 0 { }; // ill-formed };