2、派生類的析構(gòu)函數(shù)與構(gòu)造函數(shù)相同,派生類的析構(gòu)函數(shù)在執(zhí)行過(guò)程中也要對(duì)基類和成員對(duì)象進(jìn)行操作,但它的執(zhí)行過(guò)程與構(gòu)造函數(shù)嚴(yán)格相反,即:(1)對(duì)派生類新增普通成員進(jìn)行清理。(2)調(diào)用成員對(duì)象析構(gòu)函數(shù),對(duì)派生類新增的成員對(duì)象進(jìn)行清理。(3)調(diào)用基類析構(gòu)函數(shù),對(duì)基類進(jìn)行清理。派生類析構(gòu)函數(shù)的定義與基類無(wú)關(guān),與沒(méi)有繼承關(guān)系的類中的析構(gòu)函數(shù)的定義完全相同。它只負(fù)責(zé)對(duì)新增普通成員的清理工作,系統(tǒng)會(huì)自己調(diào)用基類及成員對(duì)象的析構(gòu)函數(shù)進(jìn)行相應(yīng)的清理工作。
【考點(diǎn)四】 多繼承與虛基類
1、多繼承中的二義性問(wèn)題在派生類中對(duì)基類成員的訪問(wèn)應(yīng)該是唯一的。但是,在多繼承情況下,可能造成對(duì)基類中某個(gè)成員的訪問(wèn)出現(xiàn)了不唯一的情況,這時(shí)就稱對(duì)基類成員的訪問(wèn)產(chǎn)生了二義性。要解決這一問(wèn)題,有兩種方法:(1)通過(guò)作用域運(yùn)算符(::)明確指出訪問(wèn)的是基類Basel的fun()函數(shù),還是基類Base2的fun()函數(shù)。
使用作用域運(yùn)算符進(jìn)行限定的一般格式是:<對(duì)象名>.<基類名>::<成員名>
//數(shù)據(jù)成員<對(duì)象名>.<基類名>::<成員名>(參數(shù)表>)
//成員函數(shù)(2)在類中定義同名成員對(duì)于在不同的作用域中聲明的標(biāo)識(shí)符的可見(jiàn)性原則是:如果存在兩個(gè)或多個(gè)具有包含關(guān)系的作用域,外層聲明的標(biāo)識(shí)符如果在內(nèi)層沒(méi)有聲明同名標(biāo)識(shí)符,那么它在內(nèi)層可見(jiàn);如果內(nèi)層聲明了同名標(biāo)識(shí)符,則外層標(biāo)識(shí)符在內(nèi)層不可見(jiàn),這時(shí)稱內(nèi)層變量覆蓋了外層同名變量。在類的繼承層次結(jié)構(gòu)中,基類的成員和派生類新增的成員都具有類作用域,二者的作用范圍不同,是相互包含的兩個(gè)層,派生類在內(nèi)層。這時(shí),如果派生類定義了一個(gè)和某個(gè)基類成員同名的新成員(如果是成員函數(shù),則參數(shù)表也要相同,參數(shù)不同的情況屬于重載),派生的新成員就覆蓋了外層同名成員,直接使用成員名只能訪問(wèn)到派生類的成員。
2、虛基類的定義當(dāng)一個(gè)派生類從多個(gè)基類派生,而這些基類又有一個(gè)共同的基類,當(dāng)對(duì)該基類中說(shuō)明的成員進(jìn)行訪問(wèn)時(shí),可能出現(xiàn)二義性。虛基類就是為了解決這種二義性問(wèn)題提出來(lái)的。在產(chǎn)生二義性問(wèn)題的第二種情況中,產(chǎn)生二義性的最主要的原因是基類Base在派生類Derived2中產(chǎn)生了兩個(gè)基類子對(duì)象,從而導(dǎo)致了對(duì)基類Base的成員data訪問(wèn)的不唯一性。要解決這個(gè)問(wèn)題,只需使這個(gè)公共基類Base在派生類中只產(chǎn)生一個(gè)子對(duì)象即可。虛基類就可以完成這個(gè)任務(wù)。虛基類的說(shuō)明格式如下:class<類名>:virtual<繼承方式><基類名> 其中,關(guān)鍵字virtual與繼承方式的位置無(wú)關(guān),但必須位于虛基類名之前,且virtual只對(duì)緊隨其后的基類名起作用。
3、虛基類的構(gòu)造函數(shù)使用虛基類解決二義性問(wèn)題的關(guān)鍵是在派生類中只產(chǎn)生一個(gè)虛基類子對(duì)象。為初始化基類子對(duì)象,派生類的構(gòu)造函數(shù)要調(diào)用基類的構(gòu)造函數(shù)。對(duì)于虛基類,由于派生類的對(duì)象中只有一個(gè)虛基類子對(duì)象,所以,在建立派生類的一個(gè)對(duì)象時(shí),為保證虛基類子對(duì)象只被初始化一次,這個(gè)虛基類構(gòu)造函數(shù)必須只被調(diào)用一次。雖然繼承結(jié)構(gòu)的層次可能很深,但要建立的對(duì)象所屬的類只是這個(gè)繼承結(jié)構(gòu)中間的某個(gè)類,因此將在建立對(duì)象時(shí)所指定的類稱為最派生類。虛基類子對(duì)象由最派生類的構(gòu)造函數(shù)通過(guò)調(diào)用虛基類的構(gòu)造函數(shù)進(jìn)行初始化。所以,最派生類的構(gòu)造函數(shù)的成員初始化列表中必須列出對(duì)虛基類構(gòu)造函數(shù)的調(diào)用;如果未列出,則表示使用該虛基類的缺省構(gòu)造函數(shù)。由于最派生類總是相對(duì)的,因此,從虛基類直接或間接派生的派生類中的構(gòu)造函數(shù)的成員初始化列表中都要列出對(duì)虛基類構(gòu)造函數(shù)的調(diào)用。但只有用于建立對(duì)象的最派生類的構(gòu)造函數(shù)才調(diào)用虛基類的構(gòu)造函數(shù),此時(shí)最派生類的所有基類中列出的對(duì)虛基類的構(gòu)造函數(shù)的調(diào)用在執(zhí)行過(guò)程中都被忽略,從而保證對(duì)虛基類子對(duì)象只初始化一次。當(dāng)在一個(gè)成員初始化列表中同時(shí)出現(xiàn)對(duì)虛基類和非虛基類構(gòu)造函數(shù)的調(diào)用時(shí),虛基類的構(gòu)造函數(shù)先于非虛基類的構(gòu)造函數(shù)執(zhí)行。
【考點(diǎn)五】 子類型關(guān)系公有繼承時(shí),派生類的對(duì)象可以作為基類的對(duì)象處理,派生類是基類的子類型。子類型關(guān)系使得在需要基類對(duì)象的任何地方都可以使用公有派生類的對(duì)象來(lái)替代,從而可以使用相同的函數(shù)統(tǒng)一處理基類對(duì)象和公有派生類對(duì)象(形參為基類對(duì)象時(shí),實(shí)參可以是派生類對(duì)象),而不必為每一個(gè)類設(shè)計(jì)單獨(dú)的處理程序,大大提高了程序的效率。它是實(shí)現(xiàn)多態(tài)性的重要基礎(chǔ)之一。子類型關(guān)系的定義如下:有一個(gè)特定的類型S,當(dāng)且僅當(dāng)它提供了類型T的行為時(shí),稱類型S是類型T的子類型。公有派生類的對(duì)象可以賦值給基類的對(duì)象。實(shí)際上不僅如此,具有子類型關(guān)系的基類和派生類的對(duì)象之間滿足如下賦值兼容規(guī)則:(1)公有派生類的對(duì)象可以賦值給基類的對(duì)象,即用公有派生類對(duì)象中從基類繼承來(lái)的成員,逐個(gè)賦值給基類對(duì)象的成員。(2)公有派生類的對(duì)象可以初始化基類的引用。(3)公有派生類的對(duì)象的地址可以賦值給指向基類的指針。
希望與更多計(jì)算機(jī)等級(jí)考試的網(wǎng)友交流,請(qǐng)進(jìn)入計(jì)算機(jī)等級(jí)考試論壇
更多信息請(qǐng)?jiān)L問(wèn):考試吧計(jì)算機(jī)等級(jí)考試欄目
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |