虛繼承中物件的構造順序
虛基類的構造
首先虛基類的構造是通過最底層的派生類初始化,并且繼承體系的每個類都可能在某個時刻成為最低層的派生類
class A{
public:
A(){}
}
class B:virtual public A{
public:
B(){}
}
class C:virtual public A{
public:
C(){}
}
class D:public B,public C{
public:
D(){}
}
就比如說上面這一個例子,
B b; //b是最底層基類,由b直接構造虛基類a(b先通過a的默認建構式構造其虛基類a子物件,隨后構造自身)
D d; //在這種情況下,d是最低層基類,由d直接構造基類c(d先通過a的默認建構式構造其虛基類a子物件,隨后分別通過b和c的默認建構式構造其基類b和c子物件,最后構造自身
即使a不是d的直接基類,d的建構式也可以初始化a
需要注意的一點是,如果最低層基類沒有顯示地初始化其虛基類子類物件,則虛基類的默認建構式將會被呼叫,如果最底層基類沒有默認建構式,則代碼會發生錯誤,(在本示例中d非顯示的,通過呼叫a的默認建構式構造其虛類子物件a)
建構式的順序
程式示例


-
首先初始化物件的虛基類子部分
如果一個類含有多個虛基類,則這些虛的子物件按照它們在派生串列中出現的順序從左向右構造
編譯器按照直接基類的宣告順序依次對直接基類進行檢查,以確定其中是否含有虛基類,如果有,則先構造虛基類,(本例在直接基類level1中有虛基類base1,因此先構造base1而不是base2和level12;在構造完base1后,按照從左至右的規則構建虛基類level12子物件,因為level12子物件的構建需要先構建level12的虛基類子物件base2,所以構造順序是base2、level12;在構造完所有虛基類子物件后,構造非虛類子物件) -
接下來按照直接基類在派生串列中出現的次序依次對其進行初始化
(先構建level11非虛類子物件,level11通過base2的建構式構造base2子物件后構建其自生,最后toplevel構造自身)
解構式的呼叫順序和建構式相反
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/246215.html
標籤:區塊鏈
上一篇:prim演算法的證明
下一篇:Failed to execute goal com.github.eirslett:frontend-maven-plugin:1.6:install-node-and-npm
