原谅晦涩的头衔。这可能是重复但我找不到正确的短语。
考虑以下继承层次结构。
class A
{
public:
virtual void Foo(int i) { printf("A::Foo(int i)\n"); }
void Foo(int a, int b) { Foo(a + b); }
};
class B : public A
{
public:
void Foo(int i) override { printf("B::Foo(int i)\n"); }
};
class C : public B
{
public:
void Bar() { Foo(1, 2); } //error C2660: function does not take two arguments
};
A
有两个名为Foo
的方法,参数数量不同。其中只有一个是虚拟的
B
会覆盖虚拟方法
C
尝试调用非虚方法并遇到错误。
将方法调用为A::Foo(1, 2)
确实可以正常工作。
问题:
为什么编译器不能推断A
上找到了正确的方法?
似乎很奇怪,我们必须在调用中明确添加A::
,例如:
C c;
c.A::Foo(1, 2);
答案 0 :(得分:3)
因为在Foo
的类范围内找到了名为B
的成员函数,然后名称查找停止,所以类Foo
中的A
不可见,并且,即使类A
中的版本更合适,也不会考虑进行重载解析。它隐藏着名字。
您可以使用using
将它们引入同一范围,并使重载解析按预期工作。如:
class C : public B
{
using A::Foo;
using B::Foo;
public:
void Bar() { Foo(1, 2); }
};