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 :

Virtuelles ou virtuelles pures


Sujet :

C++

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut Virtuelles ou virtuelles pures
    Bonjour,
    Je lance un peti topic sur la différence entre les fonctions virtuelles et les virtuelles pures. Je n'arrive pas bien à cerner la différence, pouvez vous m'éclairer ne serait-ce qu'un peu sur ce sujet ??
    Merci à vous tous !

  2. #2
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Virtuelle non-pure signifie que la classe de base implémente un comportement par défaut, les dérivées ne sont pas obligées de redéfinir la fonction.

    Virtuelle pure signifie au contraire une obligation de redéfinir la fonction pour les dérivée.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut
    Ok, si j'ai bien compris, les prototypes des fonctions que je déclare dans ma classe de base suivie de "=0" sont des fonctions virtuelles pures, il est obligé de les implémenter plus tard dans toutes mes classes dérivées.
    Alors que les fonctions que je déclare "virtual" dans ma classe abtraite(fonctions virtuelles non pures), je n'ai pas besoin de les implémenter dans mes classes dérivées.
    Ai-je bien compris ?
    Merci beaucoup...

  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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Oui tu as bien compris.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut
    Merci beaucoup à toi.

  6. #6
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par womannosky Voir le message
    Ok, si j'ai bien compris, les prototypes des fonctions que je déclare dans ma classe de base suivie de "=0" sont des fonctions virtuelles pures, il est obligé de les implémenter plus tard dans toutes mes classes dérivées.
    Je dirais redéfinir au lieu d'implémenter. Car particularité du C++ : une fonction membre virtuelle pure peut etre implémentée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class A
    {
    public:
        virtual void Test() = 0
        {
        }
    };
     
    class B : public A
    {
        virtual void Test() {}
    };
    Le fait d'avoir au moins une fonction virtuelle pure rend ta classe abstraite.

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

    On peut juste rajouter le fait que, bien souvent, les fonctions virtuelle pures poursuivent un seul objectif: faire savoir à la classe de base (qui deviendra alors une "interface") que la fonction existe, mais que l'on ne dispose pas des informations nécessaire (au niveau de la classe de base) pour permettre de définir un comportement par défaut
    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

  8. #8
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Comme conséquence, on peut noter que la classe de base ne sera pas instanciable mais que l'on sait d'ores et déjà que toutes ses classes filles implémentant les fonctions virtuelles pures auront une partie de l'interface (dont font partie les fonctions publiques) en commun avec la classe de base.
    polymorphisme

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut
    En effet koala01, s'il on a le matériel nécessaire pour implémenter une fonction pure dans la classe de base, il est inutile d'utiliser ce type de fonctions, autant tout simplement implémenter la fonction (non virtuelle) dans la classe de base, ainsi, toutes ses classes dérivées y auront accès par la suite.
    Merci pour vos réponses à tous.

  10. #10
    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 womannosky Voir le message
    En effet koala01, s'il on a le matériel nécessaire pour implémenter une fonction pure dans la classe de base, il est inutile d'utiliser ce type de fonctions, autant tout simplement implémenter la fonction (non virtuelle) dans la classe de base, ainsi, toutes ses classes dérivées y auront accès par la suite.
    ...Ou la déclarer virtuelle (mais non pure) si l'une des classes héritières nécessite de redéfinir le comportement de la méthode
    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

  11. #11
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par womannosky Voir le message
    En effet koala01, s'il on a le matériel nécessaire pour implémenter une fonction pure dans la classe de base, il est inutile d'utiliser ce type de fonctions, autant tout simplement implémenter la fonction (non virtuelle) dans la classe de base, ainsi, toutes ses classes dérivées y auront accès par la suite.
    Merci pour vos réponses à tous.
    Il y a le cas particulier des destructeurs. La norme dit que si une fonction membre virtuelle pure est explicitement appelée, alors elle doit etre implémentée.

    Et comme les destructeurs fils appellent automatiquement ceux de leurs parents directs, si tu déclares un destructeur, il faut qu'il soit implémenté, qu'il soit virtuel ou non, virtuel pur ou non. Exemple de code incorrect:

    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
    class A
    {
    public:
        virtual ~A() = 0; // destructeur non implémenté
    };
     
    class B : public A
    {
        // le destructeur par défaut appelle A::~A()
    };
     
    int main()
    {
        B *b = new B;
        delete b; // appel de B::~B() qui appelle A::~A()
    }
    error LNK2019: unresolved external symbol "public: virtual __thiscall A::~A(void)" (??1A@@UAE@XZ) referenced in function "public: virtual __thiscall B::~B(void)" (??1B@@UAE@XZ) main.obj
    Donc la solution est de changer A ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class A
    {
    public:
        virtual ~A() = 0
        {
        }
    };

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut
    Bonjour, quelquechose m'interpèle dans ton code, je ne doute en aucun de son exactitude mais je n'ai jamais vu de destructeur virtuel pur.
    Je croyais que dans les classes abstraites, dès qu'il y avait une fonction virtuelle ou virtuelle pure, il fallait également déclarer virtuel le destructeur, de même façon dans les classes dérivées.
    Cependant que les fonctions soient virtuelles ou virtuelles pures, j'ai toujours déclarer mon destructeur virtuel, et non virtuel pure.
    Quelle est la différence ? Pourquoi déclarer un destructeur virtuel pur aulieu de virtuel ?

    Je vous remercie pour vos réponses plus qu'honorables et compréhensives pour moi.

    A+

  13. #13
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel Voir le message
    Donc la solution est de changer A ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class A
    {
    public:
        virtual ~A() = 0
        {
        }
    };
    Ca compile? Il me semblait que les fonctions virtuelles pures dont on fournissait une définition ne pouvait pas avoir leur définition dans la classe.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  14. #14
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par womannosky Voir le message
    Bonjour, quelquechose m'interpèle dans ton code, je ne doute en aucun de son exactitude mais je n'ai jamais vu de destructeur virtuel pur.
    Comme il faut de toute manière en donner une définition, c'est rare. Le seul cas où ça me semble utile est quand le destructeur est la seule chose qui peut être virtuel pur.

    Je croyais que dans les classes abstraites, dès qu'il y avait une fonction virtuelle ou virtuelle pure, il fallait également déclarer virtuel le destructeur, de même façon dans les classes dérivées.
    C'est souvent nécessaire d'avoir le destructeur virtuel quand on a des membres virtuels, purs ou non, mais ce n'est pas obligatoire.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  15. #15
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut
    Tu me demandes si cela compile, je n'ai pas essayé, j'ai du mal m'exprimer.
    Sinon, merci pour ton explication des destructeurs virtuels purs.
    Merci encore à tous!

  16. #16
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Ca compile? Il me semblait que les fonctions virtuelles pures dont on fournissait une définition ne pouvait pas avoir leur définition dans la classe.
    Bien vu. J'avais lu ce passage dans la norme mais comme ca compile avec VC++ 8 je ne l'ai pas bien pigé. Mais g++ refuse de compiler...

    Citation Envoyé par womannosky Voir le message
    Bonjour, quelquechose m'interpèle dans ton code, je ne doute en aucun de son exactitude mais je n'ai jamais vu de destructeur virtuel pur.
    Je croyais que dans les classes abstraites, dès qu'il y avait une fonction virtuelle ou virtuelle pure, il fallait également déclarer virtuel le destructeur, de même façon dans les classes dérivées.
    Cependant que les fonctions soient virtuelles ou virtuelles pures, j'ai toujours déclarer mon destructeur virtuel, et non virtuel pure.
    Quelle est la différence ? Pourquoi déclarer un destructeur virtuel pur aulieu de virtuel ?
    Je n'en n'ai moi meme jamais eu l'utilité. Je sais juste que cela se fait quand on veut rendre la classe abstraite et qu'on ne dispose d'aucune fonction membre virtuelle pure. On fait ainsi s'une pierre 2 coups : rendre le destructeur virtuel, et créer une virtuelle pure pour rendre abstraite.

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

Discussions similaires

  1. Classe virtuelle detructeur virtuel
    Par Jeane dans le forum C++
    Réponses: 3
    Dernier message: 26/06/2006, 23h06
  2. Réponses: 2
    Dernier message: 05/03/2006, 19h29
  3. Compilation avec des fonctions virtuel pure
    Par vanitom dans le forum C++
    Réponses: 4
    Dernier message: 16/12/2005, 14h37
  4. fonctions "pures virtuelles"
    Par Biosox dans le forum C++
    Réponses: 2
    Dernier message: 08/09/2005, 10h54
  5. Réponses: 19
    Dernier message: 10/02/2005, 22h43

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