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

Virtual Function access through multiple interfaces

本文关键字:访问 虚拟 功能 接口      更新时间:2023-10-16

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

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类来解决这个问题,但有人能给我一个标准的参考吗?为什么编译器不能自己找到函数?

来自N3797

3.3.10/3名称隐藏

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

所以Foo2::foo()隐藏了Foo1::foo()

派生类中的foo隐藏具有基类不同签名的foo

要说您希望包含基的重载,您需要向Foo2:添加using声明

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