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 :

Redéfinition de fonctions virtuelles surchargées => warni


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 11
    Par défaut Redéfinition de fonctions virtuelles surchargées => warni
    Bonjour,

    J'ai dans une classe (B) plusieurs fonctions virtuelles surchargées (Init() et Init(int)).
    J'ai voulu redéfinir dans une de ses classes filles (D) une seule de ces fonctions(Init()). Et j'ai obtenu un warning (sous solaris) que je ne comprends pas bien :

    Warning: D::Init hides the virtual function B::Init(int).

    Et effectivement, j'ai une erreur de compilation quand je fais monD->Init(0).
    Donc si je comprends bien, si on ne redéfinit dans la classe fille qu'une seule des fonctions répondant au nom de Init, on perd l'accès aux autres fonctions de même nom mais de signature différente de la classe mère ?
    Comment ça se fait ? Est-ce que du coup, on est obligé de redéfinir toutes les surcharges de la fonction en appelant à chaque fois celle de la classe mère ?

    De plus, si ma classe D est définie comme ça class D : public virtual B, je n'ai plus le warning, mais je n'ai cependant toujours pas accès à monD->Init(0). Pourquoi dans ce cas, le warning a-t-il disparu ?

    Merci d'avance,
    Marie.


    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    #include <stdio.h>
    #include <iostream>
    #include <string>
     
    class B {
    public:
    	virtual void Init(int);
    	virtual void Init();
    };
     
    void B::Init(int){
    	std::cout<<"B init int"<<std::endl;
    }
     
    void B::Init(){
    	Init(0);
    	std::cout<<"B init"<<std::endl;
    }
     
     
     
    class D: public B {
    public:
    	virtual void Init();
    };
     
    void D::Init(){
    	std::cout<<"D init"<<std::endl;
    }
     
     
     
    int main (void) {
    	B* monB = new D ;
    	D* monD = new D;
    	monB->Init(0);
    	monB->Init();
    	monD->Init();
      	//monD->Init(0);
    	monD->B::Init(0);
     
    	return (0);
    }

  2. #2
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par défaut
    bonjour,

    il s'agit d'une feinte du C++ (si je puis dire). une fonction de même nom d'une classe dérivée mais de signature différente masque les fonctions de même noms de la classe mère même si elle sont virtuelles.

    D::Init() masque B::Init(int), mais redéfinit B::Init() qui est virtuel ET de même signature

    pour pallier à cela il faut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class D: public B {
    public:
       void Init();
       using B::Init;
    };

  3. #3
    Expert confirmé

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3

  4. #4
    Membre émérite Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Par défaut
    Bonjour,

    Dans ta classe dérivée, tu ne redéfinis pas Init(int):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class D: public B {
    public:
       void Init();
       void Init(int);
    };
    ça résoud le warning.

  5. #5
    Membre émérite Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Par défaut
    Tient, question que je me repose tout le temps en C++, comme je fais souvent du Delphi:

    Il est obligatoire je crois de déclarer les fonctions virtuelles dans les clasess dérivées? Ou on peut les omettres ?

    De plus, c'est un comportement du langage, ou une option de projet des IDE?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 11
    Par défaut
    Ok, merci beaucoup pour cette réponse.

    En fait, c'est même pas un problème lié au virtual, apparemment, c'est vrai tout le temps.
    Depuis, j'ai trouvé ça (va savoir pourquoi je l'avais pas trouvé avant. Mon karma sans doute).
    http://c.developpez.com/faq/cpp/?pag...CLASS_masquage

    Mais ce que je me demande encore, c'est pourquoi est-ce que par défaut ces fonctions de la classe mère ne sont pas accessibles ? Comment sont stockées les fonctions disponibles pour une classe particulière ? Un truc avec la vtable ?

    Marie.

  7. #7
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par défaut
    ce n'est pas nécessaire de remettre virtuel dans les classes dérivés.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 11
    Par défaut
    Non, t'es pas obligée de les redéclarer virtuelles dans les classes filles je pense. A moins qu'elles-même aient des classes filles et que tu veuilles que leurs fonctions (celles des classes petite-filles) soient appelées à l'execution même lorsqu'elles sont déclarées que comme des classes filles (et pas petite-filles).
    Mouais... pas très claire mon explication.

    Sinon j'ai bien compris comment supprimer ce warning, ce que je me demande, c'est pourquoi est-ce que le C++ fonctionne comme ça.

    Merci à tout le monde en tout cas.

  9. #9
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2
    Par défaut
    Juste une précision sur le degré d'application de la virtuallité. A partir du moment ou une classe déclare une de ses methodes comme virtuelle, toutes ses filles auront cette methode virtuelle, que le mot clé virtual soit reprécisé ou pas. Cela s'applique quelque soit le degré de descendance.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 11
    Par défaut
    Et du coup, tu peux pas "bloquer" ta virtuallité jusqu'à une certaine profondeur ?
    Je dis pas que ça sert souvent, je me demandais juste.

  11. #11
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2
    Par défaut
    A ma connaissance, ce n'est pas possible.

Discussions similaires

  1. Surcharger une fonction virtuelle
    Par pierreJTL dans le forum Débuter
    Réponses: 3
    Dernier message: 18/06/2012, 14h44
  2. Réponses: 14
    Dernier message: 18/07/2011, 21h00
  3. Limiter la redéfinition d'une fonction virtuelle ?
    Par N0vember dans le forum Débuter
    Réponses: 5
    Dernier message: 30/11/2009, 09h58
  4. Réponses: 16
    Dernier message: 21/05/2007, 01h04
  5. surcharge de fonction virtuelle et VC++6
    Par grodwar dans le forum MFC
    Réponses: 28
    Dernier message: 21/06/2006, 10h19

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