在下面的代碼中,我試圖創建一個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