C++的虛基類知識點

當在多條繼承路徑上有一個公共的基類,在這些路徑的某幾條匯合處,這個公共的基類就會產生多個實例(或多個副本),若只想保存這個基類的一個實例,能夠將這個公共基類說明爲虛基類。
class x1:virtual public x{//... ...};class x2:virtual public x{//... ...};虛基類的初始化
虛基類(虛擬繼承)的初始化與通常多繼承的初始化在語法上是同樣的,但構造函數的調用次序不一樣。
派生類的構造函數的調用次序有三個原則:(1)虛基類的構造函數在非虛基類以前調用;(2) 若同一層次中包含多個虛基類,這些虛基類的構造函數按它們說明的次序調用;
(3) 若虛基類由非虛基類派生而來,則仍先調用基類構造函數,再調用派生類的構造函數。
C++的虛基類
在派生類繼承基類時,加上一個virtual關鍵詞則爲虛擬基類繼承,如:
class derive:virtual public base{};虛基類主要解決在多重繼承時,基類可能被屢次繼承,虛基類主要提供一個基類給派生類,如:classB{};class D1:public B{};class D2:public B{};class C:public D1, public D2{};這裏C在D1,D2上繼承,但有兩個基類,形成胡亂。於是使用虛基類,即:classB{};class D1:virtual public B{};class D2:virtual public B{};class C:public D1, public D2{};在使用虛基類時要注意:
(1) 一個類能夠在一個類族中既被用做虛基類,也被用做非虛基類。
(2)在派生類的對象中,同名的虛基類只產生一個虛基類子對象,而某個非虛基類產生各自的子對象。
(3) 虛基類子對象是由最派生類的構造函數經過調用虛基類的構造函數進行初始化的。
(4) 最派生類是指在繼承結構中創建對象時所指定的類。
(5) 派生類的構造函數的成員初始化列表必須列出對虛基類構造函數的調用;若是未列出,則表示使用該虛基類的缺省構造函數。
(6) 從虛基類直接或間接派生的派生類中的構造函數的成員初始化列表中都要列出對虛基類構造函數的調用。
但只有用於創建對象的最派生類的構造函數調用虛基類的構造函數,
而該派生類的全部基類中列出的對虛基類的構造函數的調用在執行中被忽略
,從而保證對虛基類的子對象只初始化一次。
(7) 在一個成員初始化列表中同時出現對虛基類和非虛基類構造函數的調用時,虛基類的構造函數先於非虛基類的構造函數執行。
相關文章
相關標籤/搜索