在C ++中重载继承规则

时间:2013-09-22 00:37:24

标签: c++ polymorphism overloading

以下版本无法编译(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()当然会产生编译错误好。

提前感谢任何启蒙!

1 个答案:

答案 0 :(得分:3)

派生类中的名称在基类中隐藏相同的名称。换句话说,在foo的上下文中解析B时,名称查找会找到B::foo并停在那里。永远找不到A::foo

using A::foo;的定义中添加B