我偶然发现编译错误,我想知道为什么会发生这种情况 代码:
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
类来解决这个问题,但是任何人都可以参考标准为什么编译器无法单独找到该函数吗?
答案 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;
};