通过多个接口访问虚拟功能

时间:2014-06-11 10:28:30

标签: c++

我偶然发现编译错误,我想知道为什么会发生这种情况 代码:

struct Foo1
{
    virtual int foo() = 0;
};
struct Foo2 : Foo1
{
    virtual int foo(int i) = 0;
};
struct Bar : public Foo2
{
    virtual int foo() { return 0; }
    virtual int foo(int i) { return i; }
};
int main() {
    Bar b;
    Foo2* f2 = &b;
    b.foo();
    //f2->foo(); // this gives an error
    return 0;
}

gcc 4.8.1上的错误是

  

错误:没有匹配函数来调用'Foo2 :: foo()'

我想知道为什么编译器看不到Foo1::foo函数? 我知道我可以通过将using Foo1::foo添加到Foo2类来解决这个问题,但是任何人都可以参考标准为什么编译器无法单独找到该函数吗?

2 个答案:

答案 0 :(得分:4)

来自 N3797

3.3.10 / 3名称隐藏

  

在成员函数定义中,块作用域中名称的声明隐藏了具有相同名称的类成员的声明;见3.3.7。 派生类(第10条)中成员的声明隐藏了同名基类成员的声明。见10.2。

因此Foo2::foo()隐藏Foo1::foo()

答案 1 :(得分:3)

派生类中的foo使用不同的基类签名隐藏foo

要说你想要包含基数的重载,你需要向using添加Foo2声明:

struct Foo2 : Foo1
{
    using Foo1::foo;
    virtual int foo(int i) = 0;
};