143 votes

Destructeur virtuel pur en C++

<p>Est-ce mal d’écrire :<pre><code></code></pre><p>pour une classe de base abstraite ?</p><p>Au moins qui compile en MSVC... Il plantera au moment de l’exécution ?</p></p>

192voto

MSN Points 30386

Oui. Vous avez également besoin de mettre en œuvre le destructeur:

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

inline A::~A() { }

devrait suffire.

Et puisque c'est une baisse de vote, je me dois de préciser: Si vous tirer quelque chose d'Un et d'essayer ensuite de les supprimer ou de les détruire, A's destructeur sera finalement appelé. Car il est pur et n'a pas de mise en œuvre, un comportement indéfini s'ensuivra. Sur une plateforme populaire, qui invoque la purecall de gestionnaire et de crash.

Edit: la fixation de la déclaration afin d'être plus conforme, compilé avec http://www.comeaucomputing.com/tryitout/

45voto

dirkgently Points 56879

Privé destructeurs: ils vous donneront une erreur lorsque vous créez un objet d'une classe dérivée -- non pas le contraire. Un diagnostic peut apparaître si.

12.4 les Destructeurs

6 Un destructeur peut être déclarée virtuelle (10.3) ou virtuelle pure (10.4); si tous les objets de cette classe ou de toute classe dérivée sont créés dans le programme, le destructeur doit être définie.

Une classe avec un destructeur virtuel pur est une classe abstraite. Notez bien:

10.4 les classes Abstraites

2 Une fonction virtuelle pure doivent être définis uniquement si la fonction est appelée avec, ou comme si, avec (12.4), l'qualifiée de l'id de la syntaxe (5.1).

[Note:une déclaration de fonction ne peut pas fournir à la fois un pur-rédacteur de devis et d'une définition de la fin de l' note ]

Pris directement à partir de l'ébauche:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: