206 votes

Pourquoi avons-nous besoin d'un destructeur virtuel pur en C++?

Je comprends le besoin d'un destructeur virtuel. Mais pourquoi avons-nous besoin d'un destructeur virtuel pur? Dans l'un des C++ articles, l'auteur a mentionné que nous utilisons pur destructeur virtuel lorsque nous voulons faire une classe abstraite.

Mais on peut faire une classe abstraite en faisant l'un des états fonctions virtuelles pures.

Donc mes questions sont les

  1. Quand avons-nous vraiment faire un destructeur virtuelle pure? Quelqu'un peut-il donner une bonne temps réel exemple?

  2. Lorsque nous créons des classes abstraites est-ce une bonne pratique pour faire le destructeur aussi virtuelle pure? Si oui..alors pourquoi?

154voto

Motti Points 32921
  1. Probablement la raison réelle que virtuelle pure destructeurs sont autorisés que pour les interdire consisterait à ajouter une autre règle de la langue et il n'y a pas besoin de cette règle puisqu'aucun mauvais effets peuvent venir que de permettre une pure destructeur virtuel.

  2. Nope, le bon vieux virtuel est suffisant dans la plupart (tous?) cas.

Si vous créez un objet avec des implémentations par défaut pour ses méthodes virtuelles et que vous voulez faire à un niveau abstrait, sans forcer quelqu'un pour remplacer toute spécifique de la méthode, vous pouvez faire le destructeur virtuelle pure. Je ne vois pas beaucoup de point, mais c'est possible.

On peut aussi supposer que chaque dérivant de la classe aurait probablement besoin d'spécifiques de nettoyage de code et d'utiliser le destructeur virtuel pur comme un rappel à l'écrire, mais cela semble artificiel.

Remarque: Le destructeur est la seule méthode qui, même si elle est virtuelle pure est d'avoir une mise en œuvre pour que la classe est défini pour être utile (oui fonctions virtuelles pures peuvent avoir des implémentations).

struct foo {
    virtual void bar() = 0;
};

void foo::bar() { /* default implementation */ }

class foof : public foo {
    void bar() { foo::bar(); } // have to explicitly call default implementation.
};

38voto

Braden Points 785

Tous vous avez besoin pour une classe abstraite est au moins une fonction virtuelle pure. Toute fonction le fera; mais, comme il arrive, le destructeur est quelque chose que toute la classe aura—donc, il est toujours là en tant que candidat. En outre, en faisant le destructeur virtuelle pure (par opposition à seulement virtuelle n'a pas de comportement des effets secondaires autres que de faire de la classe abstraite. En tant que tel, beaucoup de style guides recommandent que le pur virtuel destuctor être systématiquement utilisé pour indiquer qu'une classe est abstraite, si pour aucune autre raison qu'il donne une place de quelqu'un qui lit le code pouvez regarder pour voir si la classe est abstraite.

29voto

leander Points 6363

Si vous souhaitez créer une classe de base abstraite:

  • qui ne peut pas être instanciée (oui, oui, c'est redondant avec le terme "abstrait"!)
  • mais les besoins destructeur virtuel comportement (vous avez l'intention de transporter des pointeurs de l'ABC plutôt que des pointeurs vers les types dérivés, et de supprimer, à travers eux)
  • mais il n'a pas besoin de tout autre virtuel expédition comportement pour d'autres méthodes (peut-être qu'il sont pas d'autres méthodes? considérons un simple "protection de la ressource" conteneur qui a besoin d'un constructeurs et destructeur à la cession, mais pas beaucoup d'autre)

...il est plus facile de faire la classe abstraite en faisant le destructeur virtuelle pure et de fournir une définition (corps de la méthode).

Pour notre hypothétique ABC:

Vous garantir que ça ne peut pas être instanciée (même à l'intérieur de la classe elle-même, c'est pourquoi les constructeurs privés peut-être pas assez), vous obtenez le virtuel comportement que vous souhaitez pour le destructeur, et vous n'avez pas à trouver la balise et une autre méthode qui n'a pas besoin d'virtuel expédition comme "virtuel".

5voto

sukumar Points 21

Si vous voulez arrêter l'instanciation de la classe de base sans faire aucun changement dans votre déjà mis en œuvre et testé dériver de la classe, vous mettez en œuvre un destructeur virtuel pur dans votre classe de base.

-2voto

Steven Sudit Points 13793

1) Lorsque vous souhaitez que les classes dérivées pour faire le nettoyage. Cela est rare.

2) Non, mais vous voulez qu'il soit virtuel, cependant.

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:

X