【问题标题】:Overloading rules for inheritance in C++C++中继承的重载规则
【发布时间】:2013-09-22 00:37:24
【问题描述】:

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

提前感谢您的任何启发!

【问题讨论】:

    标签: c++ polymorphism overloading


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多