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. #21
    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
    Citation Envoyé par Flob90 Voir le message
    Oui, elle permet d'assurer les deux directement, mais la solution proposé par Laurent assure aussi les deux. Alors oui, 1 ca parait plus simple que 2, mais la différence de travail au moment d'écrire les classes n'est quand même pas flagrante au point d'invoquer un argument de simplicité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct A
    { virtual ~A() =0; };
    A::~A() {}
     
    struct B
    { virtual ~B() {} protected: B() {} };
    (7 caratères de plus écrit comme ca)

    Au début je croyais qu'un constructeur en protected n'interdisait pas totalement la création, mais je me suis rendu compte que si. Du coup je ne voit pas trop les différence entre les deux méthodes, à part une pseudo-simplicité, et le fait que la seconde oblige de définir un constructeur.
    C'est surtout le fait que tu n'as pas besoin de t'inquiéter des autres conditions que ta classe de base doit respecter...

    Si tu ne veux pas que ta classe de base soit instanciable, tu n'a qu'à déclarer le destructeur comme étant virtuel pur, et basta, même si une classe quelconque est déclarée amie de ta classe de base, même si tu veux garder un constructeur implémenté par le compilateur, même si tu n'a en réalité aucune fonction virtuelle autre (bon, d'accord, on pourrait se demander pourquoi faire hériter les autres classes de cette classe de base ), même si quoi ou qu'est-ce, tu obtient toutes les garanties en un seul geste.

    Je suis d'accord sur le fait que, comme le fait remarquer Laurent, cela na qu'un intérêt "purement conceptuel", mais son intérêt est, selon moi, des plus grands
    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

  2. #22
    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
    Je fais aussi comme ca quand j'en ai besoin (c'est à dire pas souvent, ca arrive pas tout les jours de vouloir une classe non instaciable et qui n'a pas d'autre fonction virtuel à purifier), j'aurai cru qu'il y aurait un argument fort permettant de trancher, mais apparament non, une question de choix personnel donc.

  3. #23
    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
    Citation Envoyé par Flob90 Voir le message
    Je fais aussi comme ca quand j'en ai besoin (c'est à dire pas souvent, ca arrive pas tout les jours de vouloir une classe non instaciable et qui n'a pas d'autre fonction virtuel à purifier), j'aurai cru qu'il y aurait un argument fort permettant de trancher, mais apparament non, une question de choix personnel donc.
    C'est, très certainement, un choix personnel...

    Il faut dire que c'est souvent le cas, dans bien des domaines en programmation / conception

    Mais je penses que c'est malgré tout la moins mauvaise solution dans le sens où elle permet de ne pas s'inquiéter des autres conditions: on ne veut pas que la classe soit instanciable, on déclare le destructeur comme virtuel pur, et on est sur que ce sera le cas, quelles que soient les autres situations
    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. #24
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 297
    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 297
    Par défaut
    Citation Envoyé par Flob90 Voir le message
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    struct B
    { virtual ~B() {} protected: B() {} };
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    struct C : B {
        static B* f() { return new B(); }
    };
    Seule une classe abstraite est non instanciable, seule une fonction virtuelle pure l'assure. Dans le cas où la pureté n'a de sens nulle part, il reste le destructeur pour lequel il est acceptable d'avoir cet étrange côté, pur mais implémenté (c'est possible avec toute fonction)

    Ca me rappelle ça: http://groups.google.fr/group/fr.com...1b9f2ec843d93f
    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...

  5. #25
    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
    @Luc: J'ai pensé à ca (c'est ce que j'avais en tête avant de faire un edit dans ma première réponse à Laurent), mais ca ne compile pas. (erreur, B est protégé dans ce contexte). D'ou la conclusion que les deux solutions fonctionnent.

  6. #26
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 297
    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 297
    Par défaut
    En effet. J'étais passé à côté de ce détail. Il faut vraiment rester dans B pour que cela marche -- ou alors un "#define protected public" avant l'inclusion de A.h pour passer outre, mais bon...
    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...

  7. #27
    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
    Bonjour,

    il me semble qu'on utilise un destructeur virtuel pur lorsqu'on veut rendre une classe abstraite (non instanciable) alors qu'on ne souhaite pas imposer l'implémentation d'autres fonctions membres aux classes qui vont en dériver.

    Les destructeurs virtuels purs sont les seules fonctions membres pures qui doivent être définies. Une conséquence directe de cela est que si la classe en question possède au moins une fonction membre virtuelle pure, alors son destructeur n'a pas besoin d'être pur.

    En résumé, normalement, on ne trouve des destructeurs virtuels purs que dans les classes abstraites ne possédant aucune autre fonction membre virtuelle pure.

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

    Informations forums :
    Inscription : Octobre 2003
    Messages : 506
    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 .

  9. #29
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 297
    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 297
    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...

  10. #30
    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...

  11. #31
    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é.

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

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

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Destructeur virtuel pur ?
    Par 7cacahouete7 dans le forum C++
    Réponses: 7
    Dernier message: 02/09/2013, 20h33
  2. [POO] Destructeur virtuel pur
    Par Nesto dans le forum C++
    Réponses: 3
    Dernier message: 08/11/2008, 18h18
  3. Precision sur les destructeurs virtuels
    Par Linu6 dans le forum C++
    Réponses: 15
    Dernier message: 01/07/2008, 01h46
  4. probleme sur destructeur virtuel
    Par exhortae dans le forum C++
    Réponses: 5
    Dernier message: 01/03/2008, 08h32
  5. Destructeur virtuel et cascade
    Par buzzkaido dans le forum C++
    Réponses: 5
    Dernier message: 23/06/2007, 12h23

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