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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    503
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 503
    Par défaut destructeur virtuel pur
    Bonsoir,

    dans quelle cas utilise t'on un destructeur virtuelle pure et pourquoi ?
    j'ai un exemple de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    class BaseAliment 
    {
     protected:
        //les données de la classe de base
        double m_prix;
        std::string m_name;
     
            virtual ~BaseAliment()=0;
            BaseAliment(double prix=0,const std::string& name="");
     
     public:
     
        virtual double      GetPrix() const;
        virtual std::string GetName() const; 
     
        virtual void Afficher(std::ostream & flux) const;
    };
     
    class Aliment : public BaseAliment
    {
     
    public:
        Aliment(double prix=0,const std::string& name="");
        virtual ~Aliment();
    };



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      virtual ~BaseAliment()=0;

    merci !

  2. #2
    zul
    zul est déconnecté
    Membre chevronné Avatar de zul
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    498
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 498
    Par défaut
    Le seul intérêt que je vois ici est de forcer la classe à devenir "abstraite" (cad elle ne peut pas être instanciée directement). Attention, il faut définir le destructeur, même si il est virtuel pur.

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Pour commencer, il faut peut être comprendre ce qu'est une fonction virtuelle pure.

    Une fonction virtuelle est, tu le sais surement, une fonction au sujet de laquelle on prévient le compilateur que son comportement peut être modifié dans les classes dérivées.

    Typiquement, une fonction virtuelle pure indique au compilateur que l'on n'est pas en mesure de définir un comportement adapté (pour la classe de base) pour une fonction qui peut être redéfinie dans les classes dérivées.

    Le cas le plus fréquent est que la classe de base ne dispose simplement pas des données nécessaires en vue de fournir un comportement un tant soit peu cohérent.

    Le résultat, et c'est là le point important en relation avec ta question, c'est que le compilateur -- qui a "horreur du vide" -- interdira la création d'une instance de toute classe présentant une fonction virtuelle pure, et veillera donc à ce que toutes les fonctions virtuelles pures soient définies dans les classes dérivées si l'on souhaite pouvoir en créer une instance.

    On parle, pour les classes qui présentent au moins une fonction virtuelle pure, de classe abstraite, par opposition à des classes "concrètes" qui peuvent être instanciées

    Le fait est qu'il est parfois intéressant d'interdire la création d'une instance de la classe de base: Tu pourrais estimer (à très juste titre d'ailleurs) qu'il n'est pas opportun de créer une instance de la classe Vehicule, de manière à forcer toute instance de cette classe à être soit un Camion, soit une Voiture (ces deux classes héritant de Vehicule )

    Seulement il arrive aussi que tu soit malgré tout en mesure de fournir un comportement de base pour l'ensemble des fonctions présentes dans la classe de base

    Si tu veux, malgré tout, interdire la création d'une instance de celle-ci, la seule fonction que tu peux déclarer comme étant virtuelle pure sera... le destructeur.

    NOTA: Tu devra, de toutes manières, implémenter le destructeur, tout simplement pour que les classes dérivées soient en mesure d'être détruites correctement
    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

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Ici je ne pense pas que ça ait grand intérêt, le constructeur protégé suffit à rendre la classe abstraite.

  5. #5
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    Citation Envoyé par Laurent Gomila Voir le message
    Ici je ne pense pas que ça ait grand intérêt, le constructeur protégé suffit à rendre la classe abstraite.
    euh non :€
    abstraite = avec au moins une méhode virtuelle pure

    le ctor protégé empeche juste la creation d'instance, c'ets décorrelé

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    J'ai vu les deux définitions d'abstrait, y compris par exemple par Bjarne qui dans son dernier livre indique qu'une classe abstraite est une classe dont on ne peut pas créer d'instances.

    J'avoue que cette définition n'est pas celle que j'aurais spontanément sortie, mais je ne la trouve pas si bête que ça.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    503
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 503
    Par défaut
    merci à vous tous pour vos réponses.

    donc si j'ai bien compris :

    si on veut pas instancier une classe concrète" n'ayant pas de méthode abstraite" on doit créer un destructeur virtuelle pure .

  8. #8
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Mauvais vocabulaire à divers niveaux
    Une classe concrète est instanciable.
    Une classe abstraite est non instanciable.
    Une classe est dite abstraite dès qu'elle possède une fonction virtuelle pure.
    Quand aucune fonction n'a de sens à être pure, on peut jouer avec le destructeur tant que l'on n'oublie pas de le définir.

    PS: il est des définitions de "méthode" qui disent "fonction virtuelle" -- c'est un terme impropre au C++.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  9. #9
    Membre Expert
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Par défaut
    Citation Envoyé par Asmod_D Voir le message
    donc si j'ai bien compris :

    si on veut pas instancier une classe concrète" n'ayant pas de méthode abstraite" on doit créer un destructeur virtuelle pure .
    Tu as un sérieux problème avec l'algèbre de Boole...

  10. #10
    Membre Expert

    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 : 35
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Si tu ne veus pas d'instance, tu n'as qu'à pas en créer. Si tu ne veut pas pourvoir créer d'instance, là il te faut une classe abstraite ou un constructeur en protégé.

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    503
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 503
    Par défaut
    désolé pour mes fautes d'expression
    merci pour vos réponse !

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

Discussions similaires

  1. Destructeur virtuel pur ?
    Par 7cacahouete7 dans le forum C++
    Réponses: 7
    Dernier message: 02/09/2013, 19h33
  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