7.3 多繼承與虛基類
1多繼承中的二義性問題
在派生類中對基類成員的訪問應(yīng)該是唯一的。但是,在多繼承情況下,可能造成對基類中某個成員的訪問出現(xiàn)了不唯一的情況,這時就稱對基類成員的訪問產(chǎn)生了二義性。
要解決這一問題,有兩種方法:
(1)通過作用域運(yùn)算符(::)明確指出訪問的是基類Basel的fun()函數(shù),還是基類Base2的fun()函數(shù)。
使用作用域運(yùn)算符進(jìn)行限定的一般格式是:
<對象名>.<基類名>::<成員名>
//數(shù)據(jù)成員
<對象名>.<基類名>::<成員名>(參數(shù)表>)
//成員函數(shù)
(2)在類中定義同名成員
對于在不同的作用域中聲明的標(biāo)識符的可見性原則是:如果存在兩個或多個具有包含關(guān)系的作用域,外層聲明的標(biāo)識符如果在內(nèi)層沒有聲明同名標(biāo)識符,那么它在內(nèi)層可見;如果內(nèi)層聲明了同名標(biāo)識符,則外層標(biāo)識符在內(nèi)層不可見,這時稱內(nèi)層變量覆蓋了外層同名變量。
在類的繼承層次結(jié)構(gòu)中,基類的成員和派生類新增的成員都具有類作用域,二者的作用范圍不同,是相互包含的兩個層,派生類在內(nèi)層。這時,如果派生類定義了一個和某個基類成員同名的新成員(如果是成員函數(shù),則參數(shù)表也要相同,參數(shù)不同的情況屬于重載),派生的新成員就覆蓋了外層同名成員,直接使用成員名只能訪問到派生類的成員。
2虛基類的定義
當(dāng)一個派生類從多個基類派生,而這些基類又有一個共同的基類,當(dāng)對該基類中說明的成員進(jìn)行訪問時,可能出現(xiàn)二義性。虛基類就是為了解決這種二義性問題提出來的。
在產(chǎn)生二義性問題的第二種情況中,產(chǎn)生二義性的最主要的原因是基類Base在派生類Derived2中產(chǎn)生了兩個基類子對象,從而導(dǎo)致了對基類Base的成員data訪問的不唯一性。要解決這個問題,只需使這個公共基類Base在派生類中只產(chǎn)生一個子對象即可。虛基類就可以完成這個任務(wù)。
虛基類的說明格式如下:
class<類名>:virtual<繼承方式><基類名>
其中,關(guān)鍵字virtual與繼承方式的位置無關(guān),但必須位于虛基類名之前,且virtual只對緊隨其后的基類名起作用。
3虛基類的構(gòu)造函數(shù)
使用虛基類解決二義性問題的關(guān)鍵是在派生類中只產(chǎn)生一個虛基類子對象。為初始化基類子對象,派生類的構(gòu)造函數(shù)要調(diào)用基類的構(gòu)造函數(shù)。對于虛基類,由于派生類的對象中只有一個虛基類子對象,所以,在建立派生類的一個對象時,為保證虛基類子對象只被初始化一次,這個虛基類構(gòu)造函數(shù)必須只被調(diào)用一次。雖然繼承結(jié)構(gòu)的層次可能很深,但要建立的對象所屬的類只是這個繼承結(jié)構(gòu)中間的某個類,因此將在建立對象時所指定的類稱為最派生類。虛基類子對象由最派生類的構(gòu)造函數(shù)通過調(diào)用虛基類的構(gòu)造函數(shù)進(jìn)行初始化。所以,最派生類的構(gòu)造函數(shù)的成員初始化列表中必須列出對虛基類構(gòu)造函數(shù)的調(diào)用;如果未列出,則表示使用該虛基類的缺省構(gòu)造函數(shù)。
由于最派生類總是相對的,因此,從虛基類直接或間接派生的派生類中的構(gòu)造函數(shù)的成員初始化列表中都要列出對虛基類構(gòu)造函數(shù)的調(diào)用。但只有用于建立對象的最派生類的構(gòu)造函數(shù)才調(diào)用虛基類的構(gòu)造函數(shù),此時最派生類的所有基類中列出的對虛基類的構(gòu)造函數(shù)的調(diào)用在執(zhí)行過程中都被忽略,從而保證對虛基類子對象只初始化一次。
當(dāng)在一個成員初始化列表中同時出現(xiàn)對虛基類和非虛基類構(gòu)造函數(shù)的調(diào)用時,虛基類的構(gòu)造函數(shù)先于非虛基類的構(gòu)造函數(shù)執(zhí)行。
編輯推薦:
2014年上半年計(jì)算機(jī)等級考試報(bào)名時間預(yù)告
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |