C++ 重载决议

标签 c++ function overloading resolution

鉴于以下示例,为什么我必须显式使用语句 b->A::DoSomething() 而不仅仅是 b->DoSomething()

编译器的重载决议不应该弄清楚我在说哪种方法吗?

我正在使用 Microsoft VS 2005。(注意:在这种情况下使用虚拟没有帮助。)

class A
{
  public:
    int DoSomething() {return 0;};
};

class B : public A
{
  public:
    int DoSomething(int x) {return 1;};
};

int main()
{
  B* b = new B();
  b->A::DoSomething();    //Why this?
  //b->DoSomething();    //Why not this? (Gives compiler error.)
  delete b;
  return 0;
}

最佳答案

这两个“重载”不在同一个范围内。默认情况下,编译器只考虑可能的最小名称范围,直到找到名称匹配。参数匹配在之后完成。在您的情况下,这意味着编译器会看到 B::DoSomething。然后它尝试匹配参数列表,但失败了。

一种解决方案是将重载从 A 拉到 B 的范围内:

class B : public A {
public:
    using A::DoSomething;
    // …
}

关于C++ 重载决议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72010/

相关文章:

c++ - Qt:使用uic生成ui_类,通过类名动态加载

algorithm - Skolem 序列生成器算法

C++ 大于等于运算符

c++ - Qt 中的 Tab 键顺序

c++ - 基于数值(正、负、零)实现条件表达式的最佳方式

c++ - 嵌套 vector 的缺点是什么?

PHP-上传前重命名文件

javascript - jquery 文件内部或外部的函数就绪

c++ - 多态性和函数重载?

c++ - 重载运算符时出错