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:
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:
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 ?