为什么const / non-const函数重载的继承模棱两可?

时间:2019-01-18 17:06:13

标签: 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 

get函数的调用是模棱两可的。不管const版本需要满足更多要求。 (在常量get上调用C也是模棱两可的,但是有一个可能的函数要调用。) 标准中是否存在此类行为的原因?谢谢!

2 个答案:

答案 0 :(得分:18)

当编译器试图在重载解析之前弄清楚名称get所指的实体时,就会出现歧义。它可以是类A或类B中函数的名称。为了构建重载列表,编译器只需选择要从中提取函数的类之一即可。为了解决这个问题,您可以将名称从两个基类中引入派生类中(并使它们公开):

class C : public A, public B { public: using A::get; public: using B::get; };

答案 1 :(得分:13)

问题是您实际上并没有一个统一的重载集,其中可变变量无疑是最好的,但在A两个不同的重载集中, B,并且编译器不会自动将它们合并。

放入

using A::get;
using B::get;
C

合并重载集,从而解决歧义。