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

Langage C++ Discussion :

Overload de fonction caché par l'héritage ?


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut Overload de fonction caché par l'héritage ?
    Bon le titre n'est pas très clair donc je m'explique :
    J'ai une classe A contenant 2 fonctions foo prenant en paramètre des types incompatibles entr eux.
    Lorsque je me fais une classe B dérivant de A et surchargeant une seule des 2 foo, il m'est impossible d'utiliser l'autre fonction sur un objet de type B.

    Un bout de code minimal pour reproduire le problème :
    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
    class A
    {
    public:
    	A(){}
    	virtual ~A(){}
     
    	void foo( int i ){ std::cout << "A::foo_int : " << i << std::endl; }
     
    	virtual void foo( std::string const & coin ){ std::cout << "A::foo_str : " << coin << std::endl; }
    };
     
    class B : public A
    {
    public:
    	B(){}
    	virtual ~B(){}
     
    	virtual void foo( std::string const & coin ){ std::cout << "B::foo_str : " << coin << std::endl; }
    };
     
    int main(void)
    {
    	B myB;
    	myB.foo( 1 );
     
    	return EXIT_SUCCESS;
    }
    Ce code me retourne l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    1>Coin.cpp(102): error C2664: 'B::foo'*: impossible de convertir le paramètre 1 de 'int' en 'const std::string &'
    1>          Raison*: impossible de convertir de 'int' en 'const std::string'
    1>          Aucun constructeur n'a pu prendre le type de source, ou la résolution de la surcharge du constructeur était ambiguë
    Je compile sous Visual Studio 2010.

    Ma question : Je suppose que c'est normal, mais pourquoi ?
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  2. #2
    Membre émérite

    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
    Par défaut
    Apparemment, spécifier using A::foo; dans la définition de B résout le problème. Ceci dit, je ne vois pas très bien en quoi ce code devrait provoquer une erreur...

  3. #3
    Membre expérimenté Avatar de Rewpparo
    Homme Profil pro
    Amateur
    Inscrit en
    Décembre 2005
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 170
    Par défaut
    J'ai eu le même problème un jour, j'avais ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    template <typename T> class foo
    {
    public:
       doFoo(T& p_t);
    }
     
    class bar : public foo<T1>, public foo<T2>
    {
    };
    Si j'appellais doFoo dans bar, il me disait qu'il y avait ambiguité, alors que les types de paramètres étaient différents. Je suis toujours obligé de préciser

  4. #4
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    @rewpparo : Ce n'est pas du tout le même problème, le tien étant lié à un héritage multiple. Sur mon problème je n'ai aucune ambiguïté, juste une fonction de la classe parente que je ne peux pas appeler sur un objet de la classe dérivée.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  5. #5
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    C'est un masquage. Cf FAQ : Qu'est-ce que le masquage de fonction ?
    Comportement normal et solution donnée par cob59

    Attention de ne pas confondre :
    - surcharge (overloading) : fonctions de même nom mais signatures différentes dans une même classe (ou fonctions libres)
    - redéfinition (overriding) : fonctions virtuelles de même signature dans 2 classes héritant l'une de l'autre
    - masquage : fonctions de même nom mais signatures différentes

  6. #6
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    Merci pour vos réponses, je passe en résolu.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/12/2005, 11h55
  2. Fonction défini par l'utilisateur
    Par m-mas dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 19/07/2005, 09h45
  3. SQL Server / Fonction définie par l'utilisateur
    Par borgfabr dans le forum Langage SQL
    Réponses: 3
    Dernier message: 08/03/2005, 15h14
  4. Réponses: 4
    Dernier message: 15/12/2003, 17h46
  5. Fonctions définies par l'utilisateur
    Par DiGueDao dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/06/2003, 11h17

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