面向?qū)ο缶幊碳夹g(shù)與方法 課件 第6章 繼承與派生_第1頁(yè)
面向?qū)ο缶幊碳夹g(shù)與方法 課件 第6章 繼承與派生_第2頁(yè)
面向?qū)ο缶幊碳夹g(shù)與方法 課件 第6章 繼承與派生_第3頁(yè)
面向?qū)ο缶幊碳夹g(shù)與方法 課件 第6章 繼承與派生_第4頁(yè)
面向?qū)ο缶幊碳夹g(shù)與方法 課件 第6章 繼承與派生_第5頁(yè)
已閱讀5頁(yè),還剩34頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

面向?qū)ο缶幊碳夹g(shù)與方法(C++)

第6章繼承與派生第6章繼承與派生第6章

繼承與派生

6.1基類與派生類

6.2對(duì)基類成員的訪問(wèn)控制

6.2.1公有繼承

6.2.2私有繼承

6.2.3保護(hù)繼承

6.3派生類的構(gòu)造函數(shù)與析構(gòu)函數(shù)

6.3.1構(gòu)造函數(shù)

6.3.2析構(gòu)函數(shù)

6.4組合與繼承的選擇

6.5多繼承中的歧義

6.6虛基類

6.7小結(jié)

第6章繼承與派生6.1基類與派生類

6.2對(duì)基類成員的訪問(wèn)控制6.3派生類的構(gòu)造函數(shù)與析構(gòu)函數(shù) 6.4組合與繼承的選擇 6.5多繼承中的歧義 6.6虛基類 6.7小結(jié)

第6章繼承與派生6.1基類與派生類繼承是面向?qū)ο蟪绦蛟O(shè)計(jì)的基本特征之一。下面結(jié)合大學(xué)人員的例子介紹基類、派生類、派生、繼承、繼承方式、單繼承、多繼承、多重繼承等概念。Student是在UnivPerson的基礎(chǔ)上產(chǎn)生出的新類。UnivPerson稱為Student的基類(或父類),Student稱為UnivPerson的派生類(或子類)。Student繼承了UnivPerson的幾乎所有成員(構(gòu)造函數(shù)、析構(gòu)函數(shù)、賦值函數(shù)除外),并增加了新成員。這種從已有類產(chǎn)生新類的過(guò)程就是類的派生,從另一個(gè)角度看,從已有類獲得屬性和行為的過(guò)程就是類的繼承。繼承實(shí)現(xiàn)了對(duì)基類代碼的重用。派生類只有一個(gè)直接基類的情況稱為單繼承,派生類具有多個(gè)直接基類的情況稱為多繼承。一個(gè)派生類同樣可以作為基類,繼續(xù)派生出新的類,例如在Student基礎(chǔ)上派生graduate類。第6章繼承與派生第6章繼承與派生6.1基類與派生類 6.2對(duì)基類成員的訪問(wèn)控制 6.3派生類的構(gòu)造函數(shù)與析構(gòu)函數(shù) 6.4組合與繼承的選擇 6.5多繼承中的歧義 6.6虛基類 6.7小結(jié)

第6章繼承與派生6.2對(duì)基類成員的訪問(wèn)控制基類成員在派生類中的訪問(wèn)屬性,不僅與它們?cè)诨愔械脑L問(wèn)屬性有關(guān),還與繼承方式有關(guān)。6.2.1公有繼承1.公有繼承的特點(diǎn)當(dāng)派生類以public方式繼承基類時(shí),基類的public和protected成員在派生類中的訪問(wèn)屬性不變,即仍為public或protected,派生類新增加的成員函數(shù)可以訪問(wèn)它們,但外界只可以調(diào)用派生類對(duì)象的public成員。關(guān)于基類的private成員,派生類內(nèi)的成員函數(shù)不能直接訪問(wèn)。第6章繼承與派生2.同名屏蔽現(xiàn)象調(diào)用派生類對(duì)象的成員函數(shù)時(shí),如果派生類沒(méi)有定義該函數(shù),則從基類中尋找相匹配的函數(shù),包括函數(shù)名稱、返回類型、參數(shù)列表、是否帶const等都要考慮。如果派生中類重新定義(Redefining)了同名函數(shù),則編譯時(shí)基類中的所有同名函數(shù)都將被屏蔽。這時(shí),如果想調(diào)用基類中的同名函數(shù),可以通過(guò)“基類名::”進(jìn)行限制。運(yùn)行結(jié)果:Base::f()Derived2::f()Base::f()Derived4::f()第6章繼承與派生3.向上類型轉(zhuǎn)換通過(guò)公有繼承,派生類就具備了基類的功能,在需要基類對(duì)象的地方,可以用派生類對(duì)象來(lái)代替。這時(shí)存在從派生類向基類的自動(dòng)轉(zhuǎn)換,稱為向上類型轉(zhuǎn)換(upcasting),或稱為類型適應(yīng)。這種類型轉(zhuǎn)換可能在下面情況下發(fā)生:(1)用派生類對(duì)象賦值或初始化基類對(duì)象(2)用派生類對(duì)象初始化基類引用(3)將派生類對(duì)象的地址賦給指向基類的指針由于存在向上類型轉(zhuǎn)換,在這幾種情況下,一般只能訪問(wèn)基類的成員。向上類型轉(zhuǎn)換時(shí),派生類對(duì)象中的新增成員將被舍棄,只將從基類繼承來(lái)的部分賦給基類對(duì)象。這種現(xiàn)象稱為對(duì)象切割(objectslicing)。向上類型轉(zhuǎn)換是自動(dòng)進(jìn)行的。注意向下類型轉(zhuǎn)換是不能自動(dòng)進(jìn)行的,即不能自動(dòng)由基類轉(zhuǎn)換為派生類。第6章繼承與派生6.2.2私有繼承當(dāng)派生類以private方式繼承基類時(shí),基類的public和protected成員在派生類中的訪問(wèn)屬性均變?yōu)閜rivate,那么派生類新增加的成員函數(shù)可以訪問(wèn)它們,但是外界不能訪問(wèn)它們。關(guān)于基類的private成員,派生類內(nèi)的成員函數(shù)都不能直接訪問(wèn)。第6章繼承與派生6.2.2保護(hù)繼承當(dāng)派生類以protected繼承基類時(shí),基類的public和protected成員在派生類中的訪問(wèn)屬性均變?yōu)閜rotected,即派生類新增成員函數(shù)可以訪問(wèn)它們,但外界不能訪問(wèn)?;惖膒rivate成員,派生類內(nèi)都不能直接訪問(wèn)。在直接派生類中,私有繼承和保護(hù)繼承的作用相同:在類外不能訪問(wèn)任何基類成員,而派生類的成員函數(shù)可以訪問(wèn)基類的public和protected成員。但如果繼續(xù)派生,就有所不同。如果再以公有方式派生出新類,原來(lái)私有繼承的基類成員在派生類中都不可訪問(wèn),原來(lái)保護(hù)繼承的基類public和protected成員在派生類中具有protected訪問(wèn)屬性,可被新類的成員函數(shù)訪問(wèn)。關(guān)于三種繼承方式下基類成員在直接派生類中的訪問(wèn)屬性,可以總結(jié)如表所示。第6章繼承與派生第6章繼承與派生6.1基類與派生類 6.2對(duì)基類成員的訪問(wèn)控制 6.3派生類的構(gòu)造函數(shù)與析構(gòu)函數(shù)

6.4組合與繼承的選擇 6.5多繼承中的歧義 6.6虛基類 6.7小結(jié)

第6章繼承與派生6.3.1構(gòu)造函數(shù)由于派生類不能繼承基類的構(gòu)造函數(shù),因此對(duì)繼承過(guò)來(lái)的基類數(shù)據(jù)成員的初始化工作,將由派生類的構(gòu)造函數(shù)來(lái)完成。在設(shè)計(jì)派生類的構(gòu)造函數(shù)時(shí),不僅要考慮派生類新增數(shù)據(jù)成員的初始化,還要考慮基類數(shù)據(jù)成員的初始化。由于派生類的const數(shù)據(jù)成員、引用型數(shù)據(jù)成員、類類型成員的初始化操作也在構(gòu)造函數(shù)的初始化列表中進(jìn)行。初始化列表中的執(zhí)行順序是:首先調(diào)用基類的構(gòu)造函數(shù)(多個(gè)基類的初始化順序與繼承的順序有關(guān)),然后才是派生類的成員初始化(順序與類內(nèi)的聲明順序有關(guān))。6.3派生類的構(gòu)造函數(shù)與析構(gòu)函數(shù)第6章繼承與派生6.3.2析構(gòu)函數(shù)派生類不能繼承基類的析構(gòu)函數(shù),如果需要析構(gòu)的話,就要在派生類中定義自己的析構(gòu)函數(shù)。上例沒(méi)有顯性定義析構(gòu)函數(shù),實(shí)際上是利用了編譯系統(tǒng)自動(dòng)生成的析構(gòu)函數(shù)。析構(gòu)的順序與構(gòu)造的順序相反。在上例基礎(chǔ)上,添加析構(gòu)函數(shù),參見(jiàn)例6-4。6.3派生類的構(gòu)造函數(shù)與析構(gòu)函數(shù)第6章繼承與派生6.1基類與派生類 6.2對(duì)基類成員的訪問(wèn)控制 6.3派生類的構(gòu)造函數(shù)與析構(gòu)函數(shù) 6.4組合與繼承的選擇

6.5多繼承中的歧義 6.6虛基類 6.7小結(jié)

第6章繼承與派生可以看出無(wú)論是組合還是繼承,結(jié)果都是把子對(duì)象放在新類型對(duì)象中,都在新類型的構(gòu)造函數(shù)初始化列表中構(gòu)造這些子對(duì)象。那么編程時(shí)到底應(yīng)該選用那種方法呢?當(dāng)新類型需要的不是已有類的接口,而是使用已有類的功能,這時(shí)應(yīng)該采用組合。例如鳥(niǎo)與翅膀的關(guān)系,這是一種has-a的關(guān)系。當(dāng)新類型需要的是已有類的接口,這時(shí)應(yīng)該用繼承。例如鳥(niǎo)與動(dòng)物的關(guān)系,這是一種is-a的關(guān)系。6.4組合與繼承的選擇classAnimal //動(dòng)物{public: voidMove()const{}};classWing //翅膀{public: voidOpen()const{} voidClose()const{}};classBird:publicAnimal //鳥(niǎo)是一種動(dòng)物{public:

Wingwing[2]; //鳥(niǎo)具有一對(duì)翅膀};第6章繼承與派生第6章繼承與派生6.1基類與派生類 6.2對(duì)基類成員的訪問(wèn)控制 6.3派生類的構(gòu)造函數(shù)與析構(gòu)函數(shù) 6.4組合與繼承的選擇 6.5多繼承中的歧義

6.6虛基類 6.7小結(jié)

第6章繼承與派生如果一個(gè)派生類有多個(gè)基類,在這些基類中存在名字相同的成員,那么訪問(wèn)派生類對(duì)象的這些成員時(shí)就會(huì)出現(xiàn)歧義,或不確定性。classA1{public:voidf(){}};classA2{public:voidf(){};voidg(){}};classB:publicA1,publicA2{public:voidg(){}};如果主函數(shù)中有下列語(yǔ)句:Bb; //建立對(duì)象bb.f();//錯(cuò)誤!//b.A1::f(); 明確指出是調(diào)用A1類的f()6.5多繼承中的歧義如果一個(gè)派生類有多個(gè)直接基類,而這些直接基類又有一個(gè)共同的基類(派生類的間接基類)。這樣在通過(guò)派生類對(duì)象訪問(wèn)間接基類的成員時(shí),也會(huì)出現(xiàn)歧義。因?yàn)樵谂缮愔写嬖陂g接基類的兩份拷貝。這時(shí)同樣可以用作用域運(yùn)算符解決問(wèn)題,如將調(diào)用“d.f();”改寫為“d.B::f();”。不過(guò)在這種情況下,我們還是希望在派生類對(duì)象中只含一個(gè)間接基類的對(duì)象,即四個(gè)類之間有如圖所示的繼承關(guān)系,這樣就避免了上面的歧義性。通過(guò)把類A聲明為虛基類就可以滿足這樣的要求。第6章繼承與派生第6章繼承與派生6.1基類與派生類 6.2對(duì)基類成員的訪問(wèn)控制 6.3派生類的構(gòu)造函數(shù)與析構(gòu)函數(shù) 6.4組合與繼承的選擇 6.5多繼承中的歧義 6.6虛基類

6.7小結(jié)

第6章繼承與派生6.6虛基類聲明虛基類的方法是:定義派生類時(shí),在基類繼承方式前加關(guān)鍵字virtual。例如:classA //定義基類{public:voidf(){};};classB:virtualpublicA //聲明A為B的虛基類{//……};classC:virtualpublicA //聲明A為C的虛基類

{//……};當(dāng)虛基類通過(guò)多條派生路徑被一個(gè)派生類繼承時(shí),該基類只被繼承一次。虛基類構(gòu)造函數(shù)應(yīng)出現(xiàn)在所有派生類(直接派生類或間接派生類)構(gòu)造函數(shù)的初始化列表中,如果沒(méi)有顯性列出,則意味著調(diào)用虛基類默認(rèn)構(gòu)造函數(shù)。建立派生類對(duì)象時(shí),程序只調(diào)用虛基類的構(gòu)造函數(shù)一次,而且是在調(diào)用該派生類構(gòu)造函數(shù)時(shí)發(fā)生的,在調(diào)用其它中間派生類構(gòu)造函數(shù)時(shí)不再調(diào)用虛基類的構(gòu)造函數(shù),從而保證虛基類子對(duì)象只被創(chuàng)建一次。虛基類構(gòu)造函數(shù)的調(diào)用優(yōu)先于非虛基類構(gòu)造函數(shù)。第6章繼承與派生第6章繼承與派生6.1基類與派生類 6.2對(duì)基類成員的訪問(wèn)控制 6.3派生類的構(gòu)造函數(shù)與析構(gòu)函數(shù) 6.4組合與繼承的選擇 6.5多繼承中的歧義 6.6虛基類 6.7小結(jié)

第6章繼承與派生6.7小結(jié)繼承與組合是兩種重要的代碼重用技術(shù)。單繼承的派生類只有一個(gè)直接基類,多繼承的派生類有多個(gè)直接基類。派生類繼承了基類中除構(gòu)造函數(shù)、析構(gòu)函數(shù)、賦值函數(shù)之外的所有成員。這些成員在派生類中的訪問(wèn)屬性受繼承方式的影響。關(guān)于基類中的p

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論