gpt4 book ai didi

C++ 虚拟继承和构造函数

转载 作者:太空狗 更新时间:2023-10-29 21:34:54 26 4
gpt4 key购买 nike

<分区>

我有以下 C++ 代码(如果重要的话是 VS2013):

#include <iostream>
using namespace std;

struct A{
A() { cout << "A()" << endl; }
A(int i) { cout << "A(" << i << ")" << endl; }
};

struct B : /*virtual*/ public A{
B(int i) : A(i){ cout << "B(" << i << ")" << endl; }
};

struct C : /*virtual*/ public A{
C(int i) : A(i){ cout << "C(" << i << ")" << endl; }
};

struct D : /*virtual*/ public B, /*virtual*/ public C{
D() : B(2), C(3){ cout << "D()" << endl; }
};

void main() {
D d;
system("pause");
}

代码实现了一个菱形继承,一共有4个继承:B:A, C:A, D:B,​​ D:C

没有将这些继承设置为virtual,我得到以下输出:

A(2) B(2) A(3) C(3) D()

这是有道理的。 D() 先调用 B(int x),B(int x) 先调用 A(int x),然后调用 C(int x),C(int x) 先调用 A(int x),最后 D() 自己运行。

但是就虚拟继承而言,我有4个继承,也就是说我总共有16种虚拟\非虚拟继承的组合。

乱用不同的选项会产生一些非常意想不到的结果,而且我对虚拟继承的了解越多,我就越感到困惑。

这里有一些例子:

  1. 当仅将 B:A 设置为 virtual 时,我得到:

A() B(2) A(3) C(3) D()

这是有道理的——B 实际上继承了 A,因此,除非特别说明,否则 B(int x) 调用 A 的默认构造函数。

  1. 当仅将 C:A 设置为 virtual 时,我得到:

A() A(2) B(2) C(3) D()

为什么 A 的构造函数都在 B 和 C 之前?这种行为对我来说毫无意义。

  1. 当仅将 D:C 设置为 virtual 时,我得到:

A(3) C(3) A(2) B(2) D()

为什么 C 的构造函数先于 B 的构造函数?

我可以继续下去。其中一些组合会导致非常意外的结果(至少对我而言)。

我了解虚拟继承的基础知识并通过简单的示例理解它们,并且我已经看到很多关于它的问题。但其中一些行为仍然让我感到困惑。

这些多重虚拟继承是否有任何特定的规则集?

编辑:我被重定向到这个问题: Mixing virtual and non-virtual inheritance of a base class虽然这很有帮助,但我仍然对在任何特定情况下调用 A 的哪些构造函数感到困惑。我仍然需要一些帮助。

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