C'est parce que la recherche de nom s'arrête si elle trouve un nom dans l'une de vos bases. Il ne cherchera pas au-delà dans d'autres bases. La fonction de B masque la fonction de A. Vous devez re-déclarer la fonction de A dans la portée de B, de sorte que les deux fonctions soient visibles depuis B et C:
class A
{
public:
void foo(string s){};
};
class B : public A
{
public:
int foo(int i){};
using A::foo;
};
class C : public B
{
public:
void bar()
{
string s;
foo(s);
}
};
Edit: La vraie description que donne la norme est (à partir de 10.2 / 2):
Les étapes suivantes définissent le résultat de la recherche de nom dans une portée de classe, C. Tout d'abord, chaque déclaration du nom dans la classe et dans chacun de ses sous-objets de classe de base est prise en compte. Un nom de membre f dans un sous-objet B masque un nom de membre f dans un sous-objet A si A est un sous-objet de classe de base de B. Toutes les déclarations ainsi masquées sont éliminées de la considération. Chacune de ces déclarations qui a été introduite par une déclaration d'utilisation est considérée comme étant de chaque sous-objet de C qui est du type contenant la déclaration désignée par la déclaration d'utilisation.96) Si l'ensemble de déclarations résultant n'est pas tous à partir de sous-objets du même type, ou l'ensemble a un membre non statique et inclut des membres de sous-objets distincts, il y a une ambiguïté et le programme est mal formé. Sinon, cet ensemble est le résultat de la recherche.
Il a ce qui suit à dire à un autre endroit (juste au-dessus):
Pour une id-expression [ quelque chose comme "foo" ], la recherche de nom commence dans la portée de classe de this; pour un identifiant qualifié [ quelque chose comme "A :: foo", A est un spécificateur de nom imbriqué ], la recherche de nom commence dans la portée du spécificateur de nom imbriqué. La recherche de nom a lieu avant le contrôle d'accès (3.4, clause 11).
([...] mis par moi). Notez que cela signifie que même si votre toto dans B est privé, le toto dans A ne sera toujours pas trouvé (car le contrôle d'accès se produit plus tard).