




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、面向?qū)ο蟪绦蛟O(shè)計語言C+電子科技大學(xué)示范性軟件學(xué)院1第六章 繼承和派生C+的類提供了良好的模塊分解技術(shù),也具有可重用軟件所期望的品質(zhì):它們是相似一致的模塊,通過信息隱藏,將它們的接口和實現(xiàn)清楚地分開來。但是,僅有這些是不夠的,我們還希望在類的基礎(chǔ)上能取得更好的可重用性和可擴充性的目標(biāo)。面向?qū)ο蟮睦^承技術(shù)提供了實現(xiàn)上述目標(biāo)的有力手段。2第六章 繼承和派生 6.1派生類的概念6.1.1為什么要使用繼承為什么要使用繼承在自然界中,繼承這個概念是非常普遍的。小貓仔繼承了貓爸貓媽的特性,所以長得是貓鼻子貓眼,我們不會把它錯認為是小狗。繼承就是這樣,會將一些本質(zhì)的特性遺傳給子代,使子代在很大程度上具有與父
2、代相同的性質(zhì)。當(dāng)然,子代同時還具有父代沒有的特性。下面的兩張圖顯示了兩種不同的分類情況:3第六章 繼承和派生 6.1派生類的概念6.1.1為什么要使用繼承為什么要使用繼承4交通工具分類層次圖交通工具汽車飛機火車轎車旅行車慢車快車第六章 繼承和派生 6.1派生類的概念6.1.1為什么要使用繼承為什么要使用繼承5動物哺乳動物爬蟲動物嚙齒動物猿科貓科熊貓野貓家貓動物分類層次圖第六章 繼承和派生 6.1派生類的概念6.1.1為什么要使用繼承為什么要使用繼承在最簡單的情況下,一個類B繼承類A或者從類A派生類B,通常將類A稱為基類(父類),類B稱為派生類(子類)。這時,類B的對象具有類A對象的所有特性,甚
3、至還會更多一些。也可以這樣說,類B從類A派生出來。這意味著類B至少描述了與類A同樣的接口,至少包含了同類A一樣的數(shù)據(jù),可以共享類A的成員函數(shù)。例61說明了類A與類B之間的這種關(guān)系。6第六章 繼承和派生 6.1派生類的概念6.1.1為什么要使用繼承為什么要使用繼承7priApubApriApubApriBpubB第六章 繼承和派生 6.1派生類的概念6.1.1為什么要使用繼承為什么要使用繼承繼承就是從先輩處得到屬性和行為特征。類的繼承,是新的類從已有的類獲取已有的特征;換個說法就是從已有類產(chǎn)生新類的過程就是派生。類的派生實際是通過擴展、更改和特殊化,從一個已知類建立一個新類的過程。通過類的派生,
4、可以建立具有共通關(guān)鍵特征的對象家族,從而實現(xiàn)父類代碼的重用,這種繼承和派生機制對于已有程序的發(fā)展和改進是極為有力的。可以描述基類和派生類的關(guān)系為:派生類是基類的具體化,基類是派生類的抽象。即基類綜合了派生類的公共特征,派生類則在基類的基礎(chǔ)上增加了某些特征,把抽象類變成具體的、實用的類型。8第六章 繼承和派生 6.1派生類的概念6.1.1為什么要使用繼承為什么要使用繼承那么,派生類定義的成員能否與基類的成員同名呢? C+允許派生類可以重新定義基類的成員。如果派生類定義了與基類同名的成員,稱派生類的成員覆蓋了基類的同名成員。如果要在派生類中使用基類的同名成員,可以顯式地使用下述類名限定符: 類名:
5、成員 來使用基類的成員。(例6-3)9第六章 繼承和派生 6.1派生類的概念6.1.1為什么要使用繼承為什么要使用繼承一個派生類從外部看,非常類似一個基類,但內(nèi)部則有不同。特別地,一個派生類沒有權(quán)力訪問它的基類的私有數(shù)據(jù),就像其他任何類一樣。起初一看,這似乎太嚴格了,然而以正確的方式考察,這樣做的確有意義,一個類的私有成員對其他類(包括派生類) 不可訪問的原因是確保沒有其他類的成員函數(shù)依賴它們。這就允許軟件適應(yīng)未來的改變,賦予面向?qū)ο蠓椒ㄒ愿蟮哪芰Α?0第六章 繼承和派生 6.1派生類的概念6.1.1為什么要使用繼承為什么要使用繼承派生類的生成過程包括如下三步:(1)繼承基類的所有成員:將基
6、類成員全盤吸收。這樣,派生類實際上包含了他所有基類中除了構(gòu)造和析構(gòu)函數(shù)之外的所有成員;(2)改造基類成員:一個通過不同的派生方式改造基類成員的訪問控制問題;第二個方法就是在派生類中聲明一個和基類成員同名的成員覆蓋基類成員進行改造;(3)增加新的成員:根據(jù)派生類的實際特征,增加不同于基類的成員。11第六章 繼承和派生 6.1派生類的概念6.1.2 派生類的聲明和繼承方式派生類的聲明和繼承方式C+中,派生類的一般語法形式為 class 派生類名 : 基類類名, 基類類名, ;其中: “:”后面羅列的是基類類名表,它是由“,”隔開一串元素,每個元素都是“ 基類類名”。 表示訪問描述符,稱為為派生方式
7、。派生方式有私有派生(當(dāng)為private或缺省時),公有派生(當(dāng)為public)和保護派生(當(dāng)為protected)等三種。12第六章 繼承和派生 6.1派生類的概念6.1.2 派生類的聲明和繼承方式派生類的聲明和繼承方式1公有派生公有派生在公有派生情況下,基類保護成員和公有成員的訪問權(quán)限在派生類中保持不變。即 基類的保護成員在派生類中仍然是保護成員 基類的公有成員在派生類中仍然是公有成員 基類的私有成員在派生類中成為派生類的不可訪問成員 (例6-4)13第六章 繼承和派生 6.1派生類的概念6.1.2 派生類的聲明和繼承方式派生類的聲明和繼承方式現(xiàn)在請大家考慮三個問題:對于公有派生,1. 派
8、生類的對象可不可以直接賦值給基類對象?2. 基類對象的引用可不可以引用一個派生類對象?3. 基類對象的指針可不可以指向一個派生類對象?14第六章 繼承和派生 6.1派生類的概念6.1.2 派生類的聲明和繼承方式派生類的聲明和繼承方式三個問題的具體表述如下:class Parent ; class Child : public Parent ;Child c;Parent p = c;/?Parent& rc = c;/?Parent* pc = &c;/?15第六章 繼承和派生 6.1派生類的概念6.1.2 派生類的聲明和繼承方式派生類的聲明和繼承方式三個問題的答案都是肯定的。請大家看一下父類
9、對象和子類對象的內(nèi)存布局就明白為什么答案是肯定的了:16第六章 繼承和派生 6.1派生類的概念6.1.2 派生類的聲明和繼承方式派生類的聲明和繼承方式當(dāng)一個派生類的對象直接賦值給基類對象時,很明顯地,不是所有子類對象的東西都賦給了父類對象,賦予的只是子類對象的一部分。這叫做子類對象的“切片(sliced)”。需要注意的是,如果在三個問題中將父類和子類的位置反過來,那么問題的答案就是全否。請大家自行思考問什么。17第六章 繼承和派生 6.1派生類的概念6.1.2 派生類的聲明和繼承方式派生類的聲明和繼承方式2. 私有派生私有派生如果 為 private(或缺省),那么: 基類的保護成員在私有派生
10、類中是私有成員; 基類的公有成員在私有派生類中是私有成員; 基類的私有成員和不可訪問成員在私有派生類中成為派生類的不可訪問成員。也就是說,私有派生之后,基類的成員就再也無法在以后的派生類中發(fā)揮作用,相當(dāng)于阻止了基類功能的繼續(xù)派生。(例6-5)18第六章 繼承和派生 6.1派生類的概念6.1.2 派生類的聲明和繼承方式派生類的聲明和繼承方式3. 保護派生保護派生C+語言還允許保護派生方式。保護派生方式下,基類的所有公有段成員和保護段成員都成為保護派生類保護段的成員;基類的私有成員和不可訪問成員在保護派生類中成為派生類的不可訪問成員。保護派生方式一般很少使用。19第六章 繼承和派生 6.1派生類的
11、概念6.1.2 派生類的聲明和繼承方式派生類的聲明和繼承方式20publicprotectedprivatepublicprotectedprotectedprivateprotectedinaccessibleinaccessibleinaccessibleprivatePublic繼承Protected繼承Private繼承BaseMember第六章 繼承和派生 6.1派生類的概念6.1.2 派生類的聲明和繼承方式派生類的聲明和繼承方式4.靜態(tài)成員的派生靜態(tài)成員的派生static成員受段約束符的限制,基類和派生類共享基類的static成員。要求訪問靜態(tài)成員時,必須用“類名:成員”顯式地說明
12、。(例6-7)21第六章 繼承和派生 6.1派生類的概念6.1.2 派生類的聲明和繼承方式派生類的聲明和繼承方式5.訪問聲明訪問聲明類 D 從基類B私有派生,因而類D的派生類E不能訪問間接基類 B 的所有成員,這種方法表達比較簡潔。但有些時侯,這種”一刀切”的方法會帶來問題。若希望類B的某幾個成員還能被類E訪問,而不是像現(xiàn)在這樣全部變成類D的私有成員,讓類E根本看不到。為了滿足這種需要,C+提供了一種調(diào)節(jié)機制,稱為訪問聲明,它使得 B 的某幾個成員能被類 E 所訪問。22第六章 繼承和派生 6.1派生類的概念6.1.2 派生類的聲明和繼承方式派生類的聲明和繼承方式訪問聲明的形式為:(1)基類類
13、名:基類保護段或公有段數(shù)據(jù)成員;(2)基類類名:基類保護段或公有段成員函數(shù)名;23第六章 繼承和派生 6.1派生類的概念6.1.2 派生類的聲明和繼承方式派生類的聲明和繼承方式對訪問聲明的使用需要注意以下幾點: (1)訪問聲明不能說明任何類型。(2)訪問聲明僅用于派生類中恢復(fù)名字的訪問權(quán)限,不允許在派生類中降低或提升基類成員的可訪問性。(3)對重載函數(shù)名的訪問聲明將調(diào)整基類中具有該名的所有函數(shù)的訪問域。24第六章 繼承和派生 6.1派生類的概念6.1.3基類對象的初始化基類對象的初始化1.類等級類等級下面是一個繼承鏈中的類等級圖示: 25要在派生類中訪問與派生類同名的基類成員,采用 類名:成員
14、 的方式。(例6-12)第六章 繼承和派生 6.1派生類的概念6.1.3基類對象的初始化基類對象的初始化2. 基類對象的初始化基類對象的初始化在 C+ 中,派生類構(gòu)造函數(shù)的聲明為:派生類構(gòu)造函數(shù)(變元表):基類(變元表),對象成員1(變元表),對象成員n(變元表) ;構(gòu)造函數(shù)執(zhí)行時仍遵循先兄長(基類),再客人(對象成員),后自己(派生類)的順序。另一方面,執(zhí)行析構(gòu)函數(shù)時,先執(zhí)行派生類的析構(gòu)函數(shù),再執(zhí)行基類的析構(gòu)函數(shù)。(例6-13-16)26第六章 繼承和派生 6.2多繼承6.2.1多繼承的概念多繼承的概念 至今所看到的例子中,派生類僅有一個直接基類,這稱為單繼承。但是一些類卻代表兩個或多個類的
15、合成。例如,兩用沙發(fā),它是一個沙發(fā),也是一張床,兩用沙發(fā)應(yīng)允許同時繼承沙發(fā)和床的特征,即SleepSofa繼承Bed和Sofa兩個類,因此多繼承是指一個派生類有兩個或者兩個以上的直接基類。(例6-17)27第六章 繼承和派生 6.2多繼承6.2.1多繼承的概念多繼承的概念 28BedSleep()Setweight()SofawatchTV()Setweight()SleepSofafoldout ()兩用沙發(fā)的類層次第六章 繼承和派生 6.2多繼承6.2.2虛基類虛基類 1.虛基類的概念虛基類的概念 在 C+ 中,一個類不能被多次說明為一個派生類的直接基類,但可以不止一次地成為間接基類。這就
16、導(dǎo)致了一些問題。為了方便說明,先介紹多繼承的“類格”表示法。 派生類及其基類可用一有向無環(huán)圖( DAG )表示,其中的箭頭表示“由派生而來”。類的 DAG 圖常稱為一個“類格”。29第六章 繼承和派生 6.2多繼承6.2.2虛基類虛基類 class L public:int next;class A : public L ;class B : public L;30class C : public A, public Bpublic:void f() next = 0; 第六章 繼承和派生 6.2多繼承6.2.2虛基類虛基類 31LLABCL的數(shù)據(jù)成員A的數(shù)據(jù)成員L的數(shù)據(jù)成員B的數(shù)據(jù)成員C的數(shù)
17、據(jù)成員第六章 繼承和派生 6.2多繼承6.2.2虛基類虛基類 當(dāng)在多條繼承路徑上有一個公共的基類(如本例的 L ),在這些路徑中的某幾條路徑匯合處(如本例中的 C ),這個公共基類就會產(chǎn)生多個實例。也就是說,如果L中有一個叫做next的成員,那么在C中就有兩個叫做next的成員。那么,下面的代碼在編譯時就會引起二義性錯誤:C Obj;Obj.next = 0;而這條使正確的:Obj.A:next = 0;32第六章 繼承和派生 6.2多繼承6.2.2虛基類虛基類 如果只想保存這個基類的一個實例,可以將這個公共基類說明為虛擬基類或稱虛基類。它僅是簡單地將關(guān)鍵字virtual加到基類的描述上,例如
18、改寫上述例子為:class A : virtual public L ;class B : virtual public L;33BLAC第六章 繼承和派生 6.2多繼承6.2.2虛基類虛基類 多繼承優(yōu)勢會將問題變復(fù)雜。所以在現(xiàn)代的面向?qū)ο笳Z言,比如Java中,就取消了多繼承的概念。34第六章 繼承和派生 6.3繼承的意義繼承性是對象之間合作的另一種方式(另兩種方式是友元類和對象作成員),派生類繼承了基類,一個派生類對象除了可以包含基類對象,這一點和對象作成員類似,派生類還可以繼承基類中的成員, 派生類對象可以在類外直接使用繼承的基類公有成員。類既可看作模塊又可看作類型,繼承的引入使這兩種觀點更加明顯,從模塊和類型兩個角度來仔細考察繼承的意義。35第六章 繼承和派生 6.3繼承的意義
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023-2024學(xué)年江蘇省淮安市高二下學(xué)期6月期末調(diào)研測試數(shù)學(xué)試題(解析版)
- 2025屆湖北省十堰市高三三模語文試題(解析版)
- 電影解說營銷號合作協(xié)議
- 骨科醫(yī)學(xué)生職業(yè)生涯規(guī)劃
- 塑料制品中環(huán)己烷1,2-二甲酸二異壬基酯(DINCH)含量和遷移量的測定編制說明
- 骨代謝紊亂和相關(guān)元素的生物化學(xué)檢驗
- 作業(yè)安全規(guī)程管理制度
- 供水企業(yè)現(xiàn)場管理制度
- 供水公司用電管理制度
- 供水運行維護管理制度
- DeepSeek從入門到精通培訓(xùn)課件
- 統(tǒng)編版(2025版)七年級下冊道德與法治期末復(fù)習(xí)知識點背誦提綱詳細版
- 護理文件書寫導(dǎo)致的糾紛
- 2024年全國職業(yè)院校技能大賽高職組(研學(xué)旅行賽項)考試題庫(含答案)
- A3精益報告書培訓(xùn)
- 標(biāo)準(zhǔn)菌株管理
- 2024年冷庫安全管理制度(2篇)
- 天涯海角景區(qū)開發(fā)規(guī)劃
- 【MOOC】中國稅法:案例·原理·方法-暨南大學(xué) 中國大學(xué)慕課MOOC答案
- 《中醫(yī)藥標(biāo)準(zhǔn)化》課件
- 【MOOC】CC++程序設(shè)計-同濟大學(xué) 中國大學(xué)慕課MOOC答案
評論
0/150
提交評論