2

以下内容无法编译(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() 当然也会产生编译器错误。

提前感谢您的任何启发!

4

1 回答 1

3

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

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

于 2013-09-22T00:42:51.613 回答