gpt4 book ai didi

c++ - 为什么需要在菱形层次结构的中间指定虚拟继承?

转载 作者:可可西里 更新时间:2023-11-01 15:03:48 24 4
gpt4 key购买 nike

我有类的菱形层次结构:

    A
/ \
B C
\ /
D

为了避免A在D中的两个拷贝,我们需要在B和C处使用虚拟继承。

class A                     {  }; 
class B: virtual public A {};
class C: virtual public A { };
class D: public B, public C { };

问题:为什么在B和C处需要进行虚继承,即使歧义在D处?如果它在 D 会更直观。

为什么标准委员会将此功能设计成这样?如果 B 类和 C 类来自第 3 方库,我们该怎么办?

编辑:我的回答是指示 B 和 C 类,它们不应在创建其派生对象时调用 A 的构造函数,因为它将由 D 调用。

最佳答案

我不确定他们选择以这种方式设计虚拟继承的确切原因,但我相信原因与对象布局有关。

假设 C++ 的设计旨在解决菱形问题,您将在 D 中虚拟继承 B 和 C,而不是在 B 和 C 中虚拟继承 A。现在,B 和 C 的对象布局是什么?好吧,如果没有人试图从它们那里虚拟继承,那么它们每个人都会有自己的 A 拷贝,并且可以使用标准的优化布局,其中 B 和 C 在其基础上都有一个 A。但是,如果有人确实实际上继承了 B 或 C,那么对象布局就必须不同,因为两者必须共享 A 的拷贝。

问题在于,当编译器第一次看到 B 和 C 时,它不知道是否有人会继承它们。因此,编译器将不得不回退到虚拟继承中使用的较慢的继承版本,而不是默认打开的更优化的继承版本。这违反了 C++ 的“不为不用而付费”的原则(零开销原则),即您只需为明确使用的语言功能付费。

关于c++ - 为什么需要在菱形层次结构的中间指定虚拟继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5166264/

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