gpt4 book ai didi

c++ - 为什么单一虚拟继承不足以解决可怕的菱形继承(钻石问题)?

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

struct B { int i; };
struct D1 : virtual B {};
struct D2 : B {}; // <-- not virtual
struct DD : D1, D2 {};

上面的代码,编译器仍然要求 D2 也是 virtual:

DD d;
d.i = 0; // error: request for member `i' is ambiguous

我不明白的是,一旦您提示编译器 B 相对于 DDvirtual(通过 D1) 那么为什么 i 仍然是模棱两可的?

(如果我没记错的话,较旧的 VC++(2006 年)足以通过单个 virtual 继承来解决这个问题)

最佳答案

B 对于 DD 不是虚拟的 - 它对于 D1 是虚拟的。在创建 D2 时,它包含 B 的完整拷贝。所以现在 DD 有 B 的两种实现:一种作为 D2 的一部分,另一种在末尾(由 D1 指向)。并且有两个 i 拷贝,使用它确实是模棱两可的。

如果 D2 也使用虚拟继承,而不是包含 B 的拷贝,它会包含一个指向 D1 也指向的 B 实例的指针,而 DD 将只包含 B 的一个实例。

我将尝试说明内存布局,希望结果正确...:

你的情况,有一个虚拟继承和一个非虚拟 -

|    D1    |   D2 + B |    B    |
+--+-------+----------+---------+
| vptr to B ^
+-----------------------|

同时让 D1 和 D2 虚拟继承 -

|   D1   |   D2   |   B   |
+--+-----+---+----+-------+
| | ^
+---------+---------|

关于c++ - 为什么单一虚拟继承不足以解决可怕的菱形继承(钻石问题)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6620497/

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