考虑这个(完全无意义,但完全有效)类继承:
struct Area { int size; };
struct Pattern { int size; };
struct R : Area, Pattern {};
struct C : Area, Pattern {};
struct X: R , C {};
让我们看一下这个的图表great等级制度:
Area Pattern
|\ /|
| \/ |
| /\ |
|/ \|
R C
\ /
\/
X
现在,如果我没记错的话,X 应该有 4size
成员。
如何使用作用域运算符引用它们?
明显的解决方案不起作用:
X x;
x.R::Area::size = 24;
铿锵错误:
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.
海湾合作委员会错误:
<source>: In function 'auto test()':
23 : <source>:23:14: error: 'Area' is an ambiguous base of 'X'
x.R::Area::size = 8;
^~~~
一些非常需要的澄清:
-
我只是乱搞一下,这不是真正的设计
- 所以请不要指出设计的问题
- 请不要认为这是一个好的设计。至少可以说,这……不是
-
这严格来说是关于C++语法来解决歧义。
就像是static_cast<R&>(x).Area::size = 8;
这本来就很丑陋:)
为了澄清为什么原始代码不起作用,值得一提的是,合格的 id 具有以下形式(除其他外)type-name::id
so x.R::Area::y
相当于using T = R::Area; x.T::y;
就消歧义而言,这显然无济于事。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)