gpt4 book ai didi

c++ - 只有 1 个虚拟继承的菱形继承(钻石问题)

转载 作者:行者123 更新时间:2023-12-04 15:00:30 28 4
gpt4 key购买 nike

这还能解决菱形继承(钻石问题)吗?

class A
{};

class B : virtual A
{};

class C : A
{};

class D : B, C
{};

编辑:如果不是,那是什么?和这个一样吗?

class A
{};

class B : A
{};

class C : A
{};

class D : B, C
{};

还是别的什么东西?

最佳答案

菱形继承(钻石问题)和对公共(public)基础成员的模糊调用可以通过下面的等效图形得到最好的描述,这也提供了对内存模型的洞察

例子1

class A
{void foo(){};};

class B :public A
{};

class C :public A
{};

class D :public B,public C
{};

由于继承只是将两个对象的实现一个接一个地放在一起,所以基类 A 的所有方法在派生类 B 和 C 中得到复制,其等效图形表示为

                          A              A
| |
| |
B C
\ /
\ /
D

例子2

class A
{};

class B :public virtual A
{};

class C :public A
{};

class D :public B,public C
{};

使用virtual关键字,编译器为派生类B生成一个vtable,在B的vtable中有一个vptr(虚拟指针),其中存储了基类A的Offset。对于C,它仍然复制基类A的所有方法. 因此,类 D,通过基类 B 通过 vptr 引用基类 A 的成员,其中类 C 将基类 A 的成员作为拷贝引用。所以菱形继承(钻石问题)和歧义仍然存在。

                               A         A
/ |
/ |
B C
\ /
\ /
D

示例 3

class A
{};

class B :public virtual A
{};

class C :public virtual A
{};

class D :public B,public C
{};

现在当派生类 B 和 C 都虚拟继承了 A 时,Compiler 为 B 和 C 创建一个 Vtable,并在其每个 vtable 中创建一个 vptr 来引用基类 A 的偏移量。这最终解决了 Diamond Problem因为只有一个拷贝可以通过 B 或 C 看到

                                  A                                          
/ \
/ \
B C
\ /
\ /
D

关于c++ - 只有 1 个虚拟继承的菱形继承(钻石问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26534945/

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