【发布时间】:2016-08-07 12:01:44
【问题描述】:
在下面的代码中,我试图创建一个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构造函数。我无法解释这一点。这是否意味着Level2 中的Base1 和obj 内部的Level1 与直接属于Base1 的Base1 共享相同的数据?
【问题讨论】:
-
虚拟继承的全部意义在于你只有一个虚拟基础子对象。
-
您知道,与 C 不同,C++ 中的空参数列表就是
(),对吧?
标签: c++ inheritance multiple-inheritance virtual-inheritance