在下面的代码中,我试图创建一个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
我知道obj
的Base1
是虚拟继承,但在构建obj
时,Level2
和Level1
也需要构建,这导致在其每个结构中都有Base1
。但整个构建过程只调用一次Base1
构造函数。我无法解释这一点。这是否意味着Base1
在Level2
和Level1
里面obj
与Base1
共享相同的数据,直接属于obj
?
虚拟继承的重点在于您只有*一个虚拟基础子对象。 –
你知道,与C中不同的是,在C++中,空参数列表是简单的(),对吧? – curiousguy