以下版本无法编译(Apple LLVM版本4.2(clang-425.0.28)):
class A {
public:
virtual void foo() {};
virtual void foo( int i ) {};
};
class B : public A {
public:
virtual void foo( int i ) override { foo(); }
};
对于在B :: foo(int)内调用foo(),编译器错误是“参数太少”。编译器显然认为我想递归调用B :: foo(int)并且不认识我想调用A :: foo(void)。
如果我用A :: foo()替换对foo()的调用,那么错误就会消失。
可是:
1)为什么会这样?在这种情况下解析为A :: foo()(或者在类层次结构中重写的函数)似乎很明显。
2)更重要的是,如果我也想对foo(void)使用多态后期绑定,指定A :: foo()不是我想要的,B :: foo()当然会产生编译错误好。
提前感谢任何启蒙!
答案 0 :(得分:3)
派生类中的名称在基类中隐藏相同的名称。换句话说,在foo
的上下文中解析B
时,名称查找会找到B::foo
并停在那里。永远找不到A::foo
。
在using A::foo;
的定义中添加B
。