为什么const/non-const函数的继承过载不明确?

6yr*_*y6e 19 c++ inheritance overloading multiple-inheritance

我试图创建两个类,第一个使用非const实现的函数,第二个使用const实现.这是一个小例子:

class Base {
protected:
  int some;
};

class A : public virtual Base {
  const int& get() const {
    return some;
  }
};

class B : public virtual Base {
  int& get() {
    return some;
  }
};

class C : public A, B {};

C test;
test.get(); // ambiguous 
Run Code Online (Sandbox Code Playgroud)

get函数的调用是模糊的.无论const版本需要满足更多要求.(get对const的调用C也是模棱两可的,但是有一个可能的函数可以调用.)标准中有这种行为的原因吗?谢谢!

use*_*670 18

当编译器get在重载解析之前尝试确定名称引用的实体时,会出现歧义.它可以是来自类A或类B的函数名.为了构建重载列表,编译器需要只选择其中一个类来从中提取函数.为了修复它,你可以将这两个基类的名称带到派生类中(并使它们公开):

class C : public A, public B { public: using A::get; public: using B::get; };
Run Code Online (Sandbox Code Playgroud)

  • 一个重要的C++保护:如果向基类添加一个函数改变了重载集,你的代码可能会悄然破坏; 有了这个规则,它会吵闹. (11认同)
  • 烦人的C++傻笑! (2认同)

Ded*_*tor 13

问题是你实际上没有一个统一的重载集,其中可变变量将是明确最好的,但两个不同的重载集,in AB,编译器不会自动合并它们.

using A::get;
using B::get;
Run Code Online (Sandbox Code Playgroud)

in C合并重载集,从而解决歧义.