超多非虚拟继承中基类的作用域运算符

bol*_*lov 5 c++ multiple-inheritance

考虑这个(完全非荒谬,但完全有效)类继承:

struct Area { int size; };
struct Pattern { int size; };

struct R : Area, Pattern {};
struct C : Area, Pattern {};

struct X: R , C {};
Run Code Online (Sandbox Code Playgroud)

让我们看一下这个伟大层次结构的图表:

Area  Pattern
  |\  /|   
  | \/ |
  | /\ |  
  |/  \|
  R    C
   \  /
    \/
    X
Run Code Online (Sandbox Code Playgroud)

现在,如果我没有弄错的话,X应该有4个size成员.

如何使用范围运算符引用它们?

显而易见的解决方案不起作用:

X x;
x.R::Area::size = 24;
Run Code Online (Sandbox Code Playgroud)

铿锵声:

23 : <source>:23:3: error: ambiguous conversion from derived class 'X' to base class 'Area':
    struct X -> struct R -> struct Area
    struct X -> struct C -> struct Area
  x.R::Area::size = 8;
  ^
1 error generated.
Run Code Online (Sandbox Code Playgroud)

gcc错误:

<source>: In function 'auto test()':
23 : <source>:23:14: error: 'Area' is an ambiguous base of 'X'
   x.R::Area::size = 8;
              ^~~~
Run Code Online (Sandbox Code Playgroud)

一些非常需要的澄清:

  • 我只是乱搞,这不是一个真正的设计

    • 所以请不要指出设计上的问题
    • 请不要认为这是一个很好的设计.它......不是 - 至少可以说
  • 这完全是关于解决模糊性的C++语法.

    • 请不要建议不要这样做
    • 请不要建议虚拟继承.

Mas*_*nes 5

就像是 static_cast<R&>(x).Area::size = 8;

这应该是丑陋:)

为了澄清原始代码不起作用的原因,值得一提的是,合格的id具有(以及其他)形式,type-name::id因此x.R::Area::yusing T = R::Area; x.T::y;消除歧义而言,这显然无济于事.