gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:27:56 25 4
gpt4 key购买 nike

考虑这个(完全没有意义,但完全有效的)类继承:

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

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

struct X: R , C {};

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

Area  Pattern
|\ /|
| \/ |
| /\ |
|/ \|
R C
\ /
\/
X

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

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

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

X x;
x.R::Area::size = 24;

clang 错误:

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.

gcc 错误:

<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所以x.R::Area::y相当于using T = R::Area; x.T::y;就消除歧义而言,这显然无济于事。

关于c++ - 超多重非虚拟继承中基类的作用域运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46648905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com