IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Destructeur virtuel pur ?


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2012
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Destructeur virtuel pur ?
    Bonjour,

    Suite à plusieurs recherches sur le C++ (je suis curieux et j'essaye d'approfondir mes connaissances quand je peux.) J'ai vu qu'il était possible de faire des "destructeurs virtuel pure", je voulais donc savoir quel en est l'utilité ?

    Un destructeur virtuel serre à pouvoir appeler les destructeurs fils lors de la destruction de l'instance, mais le fait que ce soit pure, je n'arrive pas bien à cerner l'idée :s

    Une personne aurait envie de m'expliquer ?

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Cela permet de rendre la classe abstraite, et donc impossible à instancier.

    Bien souvent, tu ne veux pas permettre l'instanciation d'une classe de base en tant que telle, essentiellement, parce qu'elle représente une abstraction trop "générique".

    Je pense, par exemple, à une classe "Widget" dans une IHM: Si tous les éléments visibles sont effectivement des Widget, tu ne créeras jamais un widget, sans précision.

    Tu créeras un Label, un ComboBox, un Button, un Menu ou autre qui dérivent tous de Widget, qui pourront être affichés et qui ont tous leur utilité propre, mais quelle serait l'utilité de pouvoir créer un élément de type Widget, sans précision

    A priori, il suffit d'une fonctions virtuelle pure pour obtenir une classe abstraite, mais tu te trouves, parfois, dans une situation dans laquelle aucune fonction n'est virtuelle, ou dans laquelle toutes les fonctions virtuelles peuvent présenter un comportement par défaut cohérent, y compris au niveau de l'abstraction, alors que la classe de base n'a aucun besoin (mieux n'a aucun intérêt quelconque) à pouvoir être instanciée.

    La seule fonction qu'il te reste pour rendre ta classe abstraite est alors... le destructeur, que tu déclareras comme virtuel pur (afin de rendre ta classe abstraite) mais pour lequel tu fourniras malgré tout l'implémentation (quitte à ce qu'il ne fasse rien), pour permettre au classes dérivées de fonctionner.
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2012
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Ok super merci ^^, j'étais entrain de faire des interface (donc class avec que des methodes pure) et j'en voyais pas l'utilité dans se cas , mais vu comme tu me l'a expliquer je comprend totalement^^, comment et quand c'est utile ^^,

  4. #4
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Cela permet de rendre la classe abstraite, et donc impossible à instancier.
    Il existe une différence entre un destructeur virtuel pur et un constructeur protégé ?

    Ou ce sont juste 2 façons de faire la même chose ?

  5. #5
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    @Iradrille> Penses aux fonctions statiques

  6. #6
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par Flob90 Voir le message
    @Iradrille> Penses aux fonctions statiques
    Tu parles de ce genre de choses ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Foo {
    public:
    	static Foo *create() { return new Foo(); } // unique_ptr si besoin
    protected: // ou private si on veut pas d'héritage
    	Foo() { }
    };
    En dehors de ça, pas de différences ?

  7. #7
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Plus ou moins, sans le new dans certains cas même. "Juste ça", c'est déjà pas mal comme différence non ? (Ceci dit dans certains cas ça revient au même)

  8. #8
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par Iradrille Voir le message
    Il existe une différence entre un destructeur virtuel pur et un constructeur protégé ?

    Ou ce sont juste 2 façons de faire la même chose ?
    Ce sont deux manières différentes de faire la même chose.

    Le fait est que le constructeur protégé va souvent de pair avec un destructeur protégé et non virtuel dans le sens où cela correspond finalement à l'une des formes canoniques de Coplien adaptées aux classes ayant sémantique d'entité.

    Cependant, cette manière de travailler t'interdit d'invoquer le destructeur (à l'occasion d'un delete, par exemple) sur un pointeur ou une référence vers la classe de base, et pour cause : le destructeur est protégé.

    Cela peut représenter certains avantages, quand tu as la certitude que deux (pointeurs sur ) instances de classes dérivées ne seront jamais "mélangées" dans une seule et même collection.

    Par exemple, cette interdiction de faire appel au destructeur de la classe de base sera surement la bienvenue avec les classes Client et Fournisseurs qui ne seraient sans doute jamais mélangées dans une collection de Personne * )

    Mais cela peut représenter un frein certain dans d'autres circonstances: Par exemple, si tu as une collection de DrawableItem *, tu voudras sans doute être en mesure de tous les détruire en même temps, quel que puisse être le type réel de l'objet traçable.

    Dans ce cas, la présence d'un destructeur publique et virtuel est chaudement recommandée.

    Mais, si tu ne disposes pas d'une fonction virtuelle que tu pourrais rendre pure dans DrawableItem, la seule solution qu'il te reste pour faire en sorte que cette classe soit effectivement abstraite est... de déclarer le destructeur virtuel pur. Etant donné qu'il est déjà virtuel, le changement n'est pas particulièrement lourd
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. destructeur virtuel pur
    Par Asmod_D dans le forum C++
    Réponses: 31
    Dernier message: 31/08/2010, 18h11
  2. [POO] Destructeur virtuel pur
    Par Nesto dans le forum C++
    Réponses: 3
    Dernier message: 08/11/2008, 17h18
  3. Precision sur les destructeurs virtuels
    Par Linu6 dans le forum C++
    Réponses: 15
    Dernier message: 01/07/2008, 00h46
  4. probleme sur destructeur virtuel
    Par exhortae dans le forum C++
    Réponses: 5
    Dernier message: 01/03/2008, 07h32
  5. Destructeur virtuel et cascade
    Par buzzkaido dans le forum C++
    Réponses: 5
    Dernier message: 23/06/2007, 11h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo