面向?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基類(lèi)與派生類(lèi)

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

6.2.1公有繼承

6.2.2私有繼承

6.2.3保護(hù)繼承

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

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

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

6.4組合與繼承的選擇

6.5多繼承中的歧義

6.6虛基類(lèi)

6.7小結(jié)

第6章繼承與派生6.1基類(lèi)與派生類(lèi)

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

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

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

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

第6章繼承與派生6.3.1構(gòu)造函數(shù)由于派生類(lèi)不能繼承基類(lèi)的構(gòu)造函數(shù),因此對(duì)繼承過(guò)來(lái)的基類(lèi)數(shù)據(jù)成員的初始化工作,將由派生類(lèi)的構(gòu)造函數(shù)來(lái)完成。在設(shè)計(jì)派生類(lèi)的構(gòu)造函數(shù)時(shí),不僅要考慮派生類(lèi)新增數(shù)據(jù)成員的初始化,還要考慮基類(lèi)數(shù)據(jù)成員的初始化。由于派生類(lèi)的const數(shù)據(jù)成員、引用型數(shù)據(jù)成員、類(lèi)類(lèi)型成員的初始化操作也在構(gòu)造函數(shù)的初始化列表中進(jìn)行。初始化列表中的執(zhí)行順序是:首先調(diào)用基類(lèi)的構(gòu)造函數(shù)(多個(gè)基類(lèi)的初始化順序與繼承的順序有關(guān)),然后才是派生類(lèi)的成員初始化(順序與類(lèi)內(nèi)的聲明順序有關(guān))。6.3派生類(lèi)的構(gòu)造函數(shù)與析構(gòu)函數(shù)第6章繼承與派生6.3.2析構(gòu)函數(shù)派生類(lèi)不能繼承基類(lèi)的析構(gòu)函數(shù),如果需要析構(gòu)的話,就要在派生類(lèi)中定義自己的析構(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派生類(lèi)的構(gòu)造函數(shù)與析構(gòu)函數(shù)第6章繼承與派生6.1基類(lèi)與派生類(lèi) 6.2對(duì)基類(lèi)成員的訪問(wèn)控制 6.3派生類(lèi)的構(gòu)造函數(shù)與析構(gòu)函數(shù) 6.4組合與繼承的選擇

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

第6章繼承與派生可以看出無(wú)論是組合還是繼承,結(jié)果都是把子對(duì)象放在新類(lèi)型對(duì)象中,都在新類(lèi)型的構(gòu)造函數(shù)初始化列表中構(gòu)造這些子對(duì)象。那么編程時(shí)到底應(yīng)該選用那種方法呢?當(dāng)新類(lèi)型需要的不是已有類(lèi)的接口,而是使用已有類(lèi)的功能,這時(shí)應(yīng)該采用組合。例如鳥(niǎo)與翅膀的關(guān)系,這是一種has-a的關(guān)系。當(dāng)新類(lèi)型需要的是已有類(lèi)的接口,這時(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基類(lèi)與派生類(lèi) 6.2對(duì)基類(lèi)成員的訪問(wèn)控制 6.3派生類(lèi)的構(gòu)造函數(shù)與析構(gòu)函數(shù) 6.4組合與繼承的選擇 6.5多繼承中的歧義

6.6虛基類(lèi) 6.7小結(jié)

第6章繼承與派生如果一個(gè)派生類(lèi)有多個(gè)基類(lèi),在這些基類(lèi)中存在名字相同的成員,那么訪問(wèn)派生類(lèi)對(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類(lèi)的f()6.5多繼承中的歧義如果一個(gè)派生類(lèi)有多個(gè)直接基類(lèi),而這些直接基類(lèi)又有一個(gè)共同的基類(lèi)(派生類(lèi)的間接基類(lèi))。這樣在通過(guò)派生類(lèi)對(duì)象訪問(wèn)間接基類(lèi)的成員時(shí),也會(huì)出現(xiàn)歧義。因?yàn)樵谂缮?lèi)中存在間接基類(lèi)的兩份拷貝。這時(shí)同樣可以用作用域運(yùn)算符解決問(wèn)題,如將調(diào)用“d.f();”改寫(xiě)為“d.B::f();”。不過(guò)在這種情況下,我們還是希望在派生類(lèi)對(duì)象中只含一個(gè)間接基類(lèi)的對(duì)象,即四個(gè)類(lèi)之間有如圖所示的繼承關(guān)系,這樣就避免了上面的歧義性。通過(guò)把類(lèi)A聲明為虛基類(lèi)就可以滿足這樣的要求。第6章繼承與派生第6章繼承與派生6.1基類(lèi)與派生類(lèi) 6.2對(duì)基類(lèi)成員的訪問(wèn)控制 6.3派生類(lèi)的構(gòu)造函數(shù)與析構(gòu)函數(shù) 6.4組合與繼承的選擇 6.5多繼承中的歧義 6.6虛基類(lèi)

6.7小結(jié)

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

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

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