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)
Ded*_*tor 13
问题是你实际上没有一个统一的重载集,其中可变变量将是明确最好的,但两个不同的重载集,in A和B,编译器不会自动合并它们.
放
using A::get;
using B::get;
Run Code Online (Sandbox Code Playgroud)
in C合并重载集,从而解决歧义.