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 ?