gpt4 book ai didi

c++ - 虚继承中direct base是如何构造的?

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

在下面的代码中,我试图创建一个 Leaf对象 obj查看多层继承中的构造函数顺序,但我找到了 obj 的结构在这种情况下,构造函数调用有点奇怪。

#include<iostream>
using namespace std;
class Base1 {
public:
Base1(void) {
cout << "class Base1" << endl;
}
};
class Base2 {
public:
Base2(void) {
cout << "class Base2" << endl; }
};
class Level1 : public Base2, virtual public Base1
{
public:
Level1(void)
{
cout << "class Level1" << endl;
}
};

class Level2 : public Base2, virtual public Base1
{
public:
Level2(void)
{
cout << "class Level2" << endl;
}
};

class Leaf :virtual public Level2, virtual public Level1
{
public:
Leaf(void)
{
cout << "class Leaf" << endl;
}
};


int main(void)
{
Leaf obj;
return 0;
}

输出显示构造函数调用:

class Base1
class Base2
clase Level2
class Base2
class Level1
class Leaf

但是程序最后obj的结构其实是:

obj
--Level2
----Base2
----Base1
--Level1
----Base2
----Base1
--Base1

我知道 Base1obj是虚继承的,但是在obj的构建过程中, Level2Level1还需要构建,这导致 Base1在他们的每一个结构中。但是整个构建过程只调用了Base1构造函数一次。我无法解释这一点。这是否意味着 Base1Level2Level1里面objBase1 共享相同的数据直接属于obj

最佳答案

But the whole construction process only calls Base1 constructor once. I cannot explain this.

解释是Base1是层次结构中所有类的虚拟基类。这正是虚拟基的含义及其用途:共享公共(public)基类实例。

引自 cppreference

For each distinct base class that is specified virtual, the most derived object contains only one base class subobject of that type, even if the class appears many times in the inheritance hierarchy (as long as it is inherited virtual every time).

All virtual base subobjects are initialized before any non-virtual base subobject, so only the most derived class calls the constructors of the virtual bases in its member initializer list:

考虑到虚拟继承,你的结构图可以认为是这样的:

obj
--Level2
----Base2
----+-------Base1
--Level1 / /
----Base2 / /
----+----/ /
--+-------/

Does this mean the Base1 in Level2 and Level1 inside obj shares the same data with Base1 that directly belongs to obj?

是的。 obj 的整个结构中只有一个 Base1 实例。

关于c++ - 虚继承中direct base是如何构造的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36648411/

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