錢能C程序設(shè)計教程10_第1頁
錢能C程序設(shè)計教程10_第2頁
錢能C程序設(shè)計教程10_第3頁
錢能C程序設(shè)計教程10_第4頁
錢能C程序設(shè)計教程10_第5頁
已閱讀5頁,還剩14頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、C+程序設(shè)計教程(第二版)Chapter 10 Inheritance 09:13:151第十章內(nèi)容繼承結(jié)構(gòu) ( Inheritance Structure ) 訪問父類成員 ( Access Fathers Member ) 派生類的構(gòu)造 ( Constructing Derived Classes ) 繼承方式 ( Inheritance Mode )繼承與組合 ( Inheritance & Composition ) 多繼承概念 ( Multi-Inheritance Concept ) 多繼承技術(shù) ( Multi-Inheritance Technology ) 09:13:1521

2、. 繼承結(jié)構(gòu) ( Inheritance Structure ) 宇宙萬事萬物都是分類分層的,解決問題可以從事物之間的上下關(guān)系中著手這是繼承引入程序設(shè)計的前提例如:已知鳥的屬性,鴨子是什么的描述便可以在鳥的基礎(chǔ)上進(jìn)行:除了是鳥之外,還會一種區(qū)別于其他鳥的特殊的嘎嘎叫 因為鴨子不會飛,于是就在繼承鳥的屬性中去掉會飛的屬性09:13:153派生類對象結(jié)構(gòu) 對于下面的繼承關(guān)系:class Father int a,b;public:/ 成員函數(shù);class Son:public Father int c;public: / 成員函數(shù);基類對象子類對象子類對象空間總是不小于基類對象cabab基類部分子

3、類添加部分09:13:1542. 訪問父類成員 ( Access Fathers Member ) 捆綁子類對象可以訪問父類成員函數(shù)和自身成員函數(shù);捆綁基類對象只能訪問基類成員函數(shù),不能訪問子類成員函數(shù),這是自然的: Student ds(“Jenny); GraduateStudent gs(“Smith”); ds.addCourse(3, 2.5); ds.display(); gs.addCourse(3, 3.0); gs.display(); gs.getQualifier(); ds.getQualifier(); / error09:13:155子類也是基類的用戶,其成員函數(shù)不

4、能訪問基類的私有成員但子類可以區(qū)別于外來用戶,讓基類protected成員允許子類對象訪問而不許外來對象訪問. 例如,對于基類: class Father int a; protected: void fp() couta; public: void print() couta; ;外來用戶:void fn() Son d; d.print(); / ok d.disp(); / ok d.fp(); / error Father f; f.print(); / ok f.fp(); / error子類用戶:class Son : public Father int b;public: voi

5、d disp() fp(); / ok print(); / ok void ed()a+; / error;09:13:1563.構(gòu)造子類對象 ( Constructing Objects of SubClass ) 默認(rèn)構(gòu)造:如果子類沒有構(gòu)造函數(shù),則調(diào)用默認(rèn)構(gòu)造函數(shù),默認(rèn)構(gòu)造函數(shù)轉(zhuǎn)而先調(diào)用默認(rèn)父類構(gòu)造函數(shù),完成父類對象部分的構(gòu)造如果父類的上面還有父類,則依次遞歸09:13:157自定義構(gòu)造:為了規(guī)定父類構(gòu)造函數(shù)的調(diào)用方式而不是默認(rèn)調(diào)用,需要自定義子類構(gòu)造函數(shù),并且,在構(gòu)造函數(shù)定義體的初始化列表中描述父類構(gòu)造函數(shù)的調(diào)用形式描述形式與對象成員構(gòu)造的描述一致GraduateStudent ( c

6、onst string& pN, Advisor& adv ) : Student(pN), advisor(adv), qualifierGrade(0) 09:13:158覆蓋(overlap):子類定義了與祖先類(父類,或者父類的父類.)名字相同的成員class Studentpublic: void display(); / .;class GraStudent:public Studentpublic: void display(); /overlap / .;void fn() GraStudent gs; gs.display(); /call GraStudent:displa

7、y()捆綁子類對象訪問成員函數(shù),則首先匹配子類,然后父類,再父類的父類,依此類推09:13:159拷貝構(gòu)造:子類若沒有定義拷貝構(gòu)造函數(shù),則子類對象在拷貝創(chuàng)建時先調(diào)用父類的拷貝構(gòu)造函數(shù),再完成自己的位對位拷貝父類若沒有定義拷貝構(gòu)造函數(shù),則子類對象在拷貝創(chuàng)建中調(diào)用父類默認(rèn)的拷貝構(gòu)造函數(shù)賦值操作符原理相似09:13:15104. 繼承方式 ( Inheritance Mode )繼承可以公有繼承,保護(hù)繼承和私有繼承公有繼承是普通繼承,基類可以為大多數(shù)應(yīng)用服務(wù)也可以重復(fù)繼承保護(hù)繼承是“單傳”繼承,只繼承給自己的后代,應(yīng)用是以子孫的公有成員函數(shù)來對外展開服務(wù)的私有繼承是“絕版”繼承,該基類只繼承直接的子

8、類,而不考慮讓子類再繼承下去09:13:1511繼承體系中,子類可以在祖先類成員可見的范圍中調(diào)整其訪問控制屬性class A int a1;public: int a2;class B : private Apublic: using A:a2; / a2從私有轉(zhuǎn)為公有 using A:a1; / 錯: a1不可見;int main() B d; d.a2 = 1; / ok09:13:15125. 繼承與組合 ( Inheritance & Composition ) 組合:類中含有對象成員,稱為組合式包含繼承:子類繼承了父類,稱為子類對象對父類對象的繼承式包含繼承和組合都重用了類設(shè)計繼承重

9、用場合,父類對象就在自己家里,無須捆綁父類對象便能對其操作但是操作受到了父類訪問控制屬性設(shè)定的制約組合重用場合,使用對象成員的操作需捆綁對象成員,而且只能使用對象的公有成員繼承部分派生部分其他數(shù)據(jù)成員Student對象Advisor對象研究生對象組合式包含繼承式包含09:13:1513繼承型的Circle類頭文件:#includepoint.hclass Circle : public Point double radius;public: /成員函數(shù);組合型的Circle類頭文件:#includepoint.hclass Circle Point point; double radius;p

10、ublic: /成員函數(shù);公有成員函數(shù)實現(xiàn)不同,但可以讓界面相同,從而不影響編程者使用繼承與組合在于實現(xiàn)技術(shù)不同09:13:1514使用含有繼承和組合的子類:只要外界不直接或無法直接使用該子類的祖先類成員或?qū)ο蟪蓡T,僅提供公有的成員函數(shù),則對外界來說,無所謂該子類的繼承式包含還是組合式包含(包含組合或繼承的哪種頭文件都可):#include”point.h”#include“circle.h” /組合或繼承int fn() Circle c(Point(2.3, 5.6), 7); c.moveTo(1, 2); c.modifyRadius(3); / 09:13:15156. 多繼承概念

11、( Multi-Inheritance Concept ) 多繼承:一個實體,來自多個類對象的組合因而它同時也可以繼承多個基類來實現(xiàn)09:13:1516多繼承的主要技術(shù)問題:由于子類可以訪問多個基類,而基類之間沒有專門的協(xié)調(diào),所以,基類可能出現(xiàn)相同的名字,這于子類來說,要訪問這種名字增加了編程的復(fù)雜性,不得不要在名字前加上前綴然而,這種同名也許意義相同,操作這種名字本身便是一種分別性操作,不合邏輯于是便尋求一種分離共性,統(tǒng)一基類的解決辦法(見CH12.5).但是,不同的父類擁有共性基類,訪問基類成員仍然存在相同名字沖突問題09:13:15177. 多繼承技術(shù) ( Multi-Inheritance Technology ) 解決多繼承基類名字沖突問題將多個父類看成同一基類下的不同子類,而所需要派生的子類來自于這些不同子類于是形成一個棱形結(jié)構(gòu)Bed sleep()Sofa watchTV()SleeperSofa FoldOut()Furniture weightgetWeight()setWeight()09:13:1518多個不同子類(如,床、沙發(fā))在繼承基類的方式上采取虛擬繼承,它的作用是,當(dāng)對象創(chuàng)建上產(chǎn)生基類重疊時,略去重復(fù)產(chǎn)生基類對象空間的行為:

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論