在一般的繼承體系下玉雾,子類(lèi)構(gòu)造函數(shù)成員列表中只能出現(xiàn)直接父類(lèi)的構(gòu)造函數(shù)翔试,而不會(huì)間接父類(lèi)以上的構(gòu)造函數(shù)。盡管如此它仍能夠在類(lèi)的繼承體系中傳遞信息抹凳。
不過(guò)遏餐,這在虛擬繼承下是行不通的伦腐。因?yàn)樽宇?lèi)可能通過(guò)不同的繼承路徑把相同的信息傳遞到共同的祖先赢底,這極有可能引起沖突。為防止此種情況出現(xiàn)C++針對(duì)虛擬繼承廢除了子類(lèi)信息在類(lèi)的繼承體系中自動(dòng)傳遞的機(jī)制柏蘑。換句話說(shuō)幸冻,在虛擬繼承環(huán)境下子類(lèi)信息只能傳遞到直接父類(lèi)而已。這個(gè)時(shí)候共同的那個(gè)祖先只能調(diào)用自己的default構(gòu)造函數(shù)了咳焚。
如下圖所示:
測(cè)試程序及結(jié)果如下:
如果信息真的能傳遞到base洽损,那么base的base(int _a)會(huì)被調(diào)用從而打印This is not default base()但是從結(jié)果來(lái)看,這條句子沒(méi)有出現(xiàn)革半,因此在虛擬繼承下子類(lèi)構(gòu)造函數(shù)信息真的無(wú)法傳達(dá)到共同祖先構(gòu)造函數(shù)碑定。
如果你非要把信息傳遞到共同的祖先,那你就在子類(lèi)中顯式調(diào)用祖先的指定構(gòu)造函數(shù)吧又官。如下圖所示:
紅框中的代碼是新添加的延刘,是base類(lèi)的構(gòu)造函數(shù)。
現(xiàn)在測(cè)試代碼不變六敬,再看測(cè)試結(jié)果碘赖。
如上圖所示,base類(lèi)的構(gòu)造函數(shù)被調(diào)用外构。
不過(guò)這招僅對(duì)虛擬繼承能用普泡。
所以,這說(shuō)明在有虛擬繼承時(shí)审编,你需要顯式地調(diào)用間接基類(lèi)的構(gòu)造函數(shù)來(lái)完成信息的傳遞撼班。