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?
c++
polymorphism
destructor
pure-virtual
Ivan Krechetov
la source
la source
Réponses:
Oui. Vous devez également implémenter le destructeur:
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/
la source
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.
Une classe avec un destructeur virtuel pur est une classe abstraite. Note bien:
Tiré directement du brouillon:
la source