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 :

fonction virtuelle cachée


Sujet :

C++

  1. #1
    Membre confirmé
    Avatar de Kalite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Points : 553
    Points
    553
    Par défaut fonction virtuelle cachée
    Bonjour,

    Je suis sous C++ builder 5.02.

    Lorsque je compile le code suivant j'obtient le warning :
    'D::f(int)' hides virtual fonction 'B::f(char)'
    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
     
    class B {
    public:
       virtual void f(char)
       {
          printf("In B::f()\n");
       }
    };
     
    class D : B {
    public:
       virtual void f(int)
       {
          printf("In D::f()\n");
          f('c');
       }
    };
    J'ai donc ajouté le using qui va bien de la façon suivante:
    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
     
    class B {
    public:
       virtual void f(char)
       {
          printf("In B::f()\n");
       }
       virtual void f(int) = 0;
    };
     
    class D : B {
    public:
       using B::f;
       virtual void f(int)
      {
          printf("In D::f()\n");
       }
    };
    Mais j'ai toujours le warning donc je voudrait savoir si l'instruction est supporté ou si j'ai fait une erreur ?

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Et avec explicit devant chacune des 2 méthodes ?

  3. #3
    Membre confirmé
    Avatar de Kalite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Points : 553
    Points
    553
    Par défaut
    Citation Envoyé par cob59 Voir le message
    Et avec explicit devant chacune des 2 méthodes ?
    Le mot clé explicit n'est que pour les constructeur si je ne m'abuse pas.
    (Je vais faire le test quand même)
    ( --> Confirmer ce n'est pas autorisé)

  4. #4
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Salut

    Ton using n'a pas d'utilité ici. using sert pour la résolution du nom lors d'un appel, pas pour la déclaration ou la définition (ça n'a d'ailleurs pas de sens).Quoi qu'il en soit, les deux snippets de code compilent sans erreurs et sans warnings dans VC9. Et cela n'a rien d'étonnant : les deux fonctions sont distinctes de par la différence entre leurs signatures respectives.

    M'est avis que ton compilo fait du sale travail, ou alors nous n'avons pas le code complet . Edit : vu que c'est un warning (et pas une erreur comme je l'ai cru), j'aurais tendance à dire que c'est un warning un peu zélé. Il doit y avoir une option pour virer ces warnings en particulier.
    Find me on github

  5. #5
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par jblecanard Voir le message
    Et cela n'a rien d'étonnant : les deux fonctions sont distinctes de par la différence entre leurs signatures respectives.
    Le warning ne me semble pas usurpé. En effet, pour pas mal de gens, le code en question sera étonnant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    D *d = new D();
    B *b = d;
     
    d->f(0); // Affiche In D::f()
    b->f(0); // Affiche In B::f()
    Car pour pas mal de gens, la fonction f est redéfinie dans D, alors que ce n'est pas le cas.

    Citation Envoyé par Kalite Voir le message
    Le mot clé explicit n'est que pour les constructeur si je ne m'abuse pas.
    (Je vais faire le test quand même)
    ( --> Confirmer ce n'est pas autorisé)
    En C++11, c'est aussi pour les opérateurs de conversion (plus besoin de ruser pour l'idiome du safe bool).
    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.

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

    Il faut cependant prendre une chose (qui n'est peut être qu'une erreur de copier coller) en compte: en dehors de toute précision contraire, l'héritage par défaut appliqué à une classe est... privé...

    C'est peut être ce que tu veux faire, mais, il faut alors savoir que tu ne pourra pas faire passer ta classe dérivée (D dans ton cas) comme étant du type de la classe de base ( B dans ton cas): l'héritage privé n'a, en effet pas la sémantique d'une relation "EST-UN" mais bel et bien celle d'une relation "EST IMPLEMENTE COMME", avec son cortège de restrictions dont l'impossibilité d'accéder, depuis la classe dérivée, aux membres publiques de la classe de base.

    Si tu souhaites effectivement pouvoir utiliser l'interface (publique) de ta classe de base, il vaut peut être mieux te tourner vers un héritage publique (en précisant explicitement l'accessibilité public lors de l'héritage)!!!

    Cela te donnerait un code proche de
    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
    class B
    {
        public:
           virtual void f(char)
           {
              printf("In B::f()\n");
           }
           virtual void f(int) = 0; // need to be implemented in derived classes
    };
    class D : public B
    {
          // void f(char) will use B's implementation, if not reimplemented
          virtual void f(int)
          {
              printf("In D::f()\n");
              f('c');
          }
    };
    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

  7. #7
    Membre confirmé
    Avatar de Kalite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Points : 553
    Points
    553
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Il faut cependant prendre une chose (qui n'est peut être qu'une erreur de copier coller) en compte: en dehors de toute précision contraire, l'héritage par défaut appliqué à une classe est... privé...
    Effectivement j'ai oublier le mot clé public dans mon héritage.

    Sinon comme indiqué plus haut j'utilise Borland C++ builder 5.02 un compilateur des années 90. Donc pour tous ce qui est du C++1x faut oublier mais merci pour l'info.

    Attention, cependant ce warning cache une erreur si j'utilise la fonction qui est "hide" avec un objet de la classe D.

Discussions similaires

  1. Classe Template et fonction virtuelle cachée
    Par benbarate dans le forum C++
    Réponses: 5
    Dernier message: 14/05/2010, 09h09
  2. Compilation avec des fonctions virtuel pure
    Par vanitom dans le forum C++
    Réponses: 4
    Dernier message: 16/12/2005, 14h37
  3. masquage de fonction virtuelle
    Par julien.sagnard dans le forum C++
    Réponses: 3
    Dernier message: 27/01/2005, 14h00
  4. Réponses: 2
    Dernier message: 07/10/2004, 17h00
  5. fonctions virtuelles
    Par Mau dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 21/11/2003, 09h53

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