具有不同签名的两个函数的继承隐藏了非虚函数

时间:2016-02-24 08:55:46

标签: c++ inheritance

原谅晦涩的头衔。这可能是重复但我找不到正确的短语。

考虑以下继承层次结构。

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);

1 个答案:

答案 0 :(得分:3)

因为在Foo的类范围内找到了名为B的成员函数,然后名称查找停止,所以类Foo中的A不可见,并且,即使类A中的版本更合适,也不会考虑进行重载解析。它隐藏着名字。

您可以使用using将它们引入同一范围,并使重载解析按预期工作。如:

class C : public B
{
    using A::Foo;
    using B::Foo;
public:
    void Bar() { Foo(1, 2); }
};

请参阅Unqualified name lookup

LIVE