C'est parce que la recherche du nom de cesse que si elle trouve un nom dans l'une de vos bases. Il ne sera pas regarder au-delà dans d'autres bases. La fonction B ombres de la fonction dans A. Vous devez re-déclarer la fonction de l'Un dans le champ d'application de B, de sorte que les deux fonctions sont visibles de l'intérieur de 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 véritable description de la Norme donne est (de 10,2/2):
Les étapes suivantes de définir le résultat de recherche d'un nom dans un contexte de classe, C. tout d'Abord, chaque déclaration pour l'
nom de la classe et dans chacune de ses de la classe de base des sous-objets est considéré comme. Un nom de membre f au sein d'une sous-
l'objet B se cache le nom d'un membre de f dans un sous-objet de A si A est une classe de base sous-objet de B. déclarations
qui sont donc cachés sont éliminés de l'examen. Chacune de ces déclarations, qui a été introduite par un
à l'aide de déclaration est considéré être de chaque sous-objet de C qui est du type de contenant la déclaration
tion désigné par l'aide-déclaration.96) Si l'ensemble des déclarations ne sont pas tous de sous-objets
du même type, ou l'ensemble a un membre non statique et comprend des membres provenant de différents sous-objets, il est
une ambiguïté et le programme est mal formé. Sinon, cet ensemble est le résultat de la recherche.
Il est la suivante-à-dire dans un autre endroit (juste au dessus):
Pour un id-expression [quelque chose comme "foo"], recherche de nom commence dans le domaine de la classe de cela, qualifiés-id [quelque chose comme "A::foo", A est un sous-nom-spécificateur], la recherche d'un nom commence dans le champ d'application de la nested-nom-rédacteur de devis. La recherche d'un nom qui se déroule avant le contrôle d'accès (3.4, article 11).
([...] mis par moi). Notez que cela signifie que même si votre foo dans B est privé, les foo dans Une sera pas encore trouvé (parce que le contrôle d'accès se produit plus tard).