錢能C++程序設計教程10Inheritance知識課件_第1頁
錢能C++程序設計教程10Inheritance知識課件_第2頁
錢能C++程序設計教程10Inheritance知識課件_第3頁
錢能C++程序設計教程10Inheritance知識課件_第4頁
錢能C++程序設計教程10Inheritance知識課件_第5頁
已閱讀5頁,還剩14頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1/31/20251C++程序設計教程(第二版)第十章繼承Chapter10

Inheritance

1/31/20252第十章內容繼承結構(InheritanceStructure)

訪問父類成員(AccessFather’sMember)

派生類的構造(ConstructingDerivedClasses)

繼承方式(InheritanceMode)繼承與組合(Inheritance&Composition)

多繼承概念(Multi-InheritanceConcept)

多繼承技術(Multi-InheritanceTechnology)1/31/202531.繼承結構(InheritanceStructure)

宇宙萬事萬物都是分類分層的,解決問題可以從事物之間的上下關系中著手.這是繼承引入程序設計的前提.例如:已知鳥的屬性,鴨子是什么的描述便可以在鳥的基礎上進行:

除了是鳥之外,還會一種區別于其他鳥的特殊的嘎嘎叫.因為鴨子不會飛,于是就在繼承鳥的屬性中去掉會飛的屬性.1/31/202552.訪問父類成員(AccessFather’sMember)

捆綁子類對象可以訪問父類成員函數和自身成員函數;捆綁基類對象只能訪問基類成員函數,不能訪問子類成員函數,這是自然的:Studentds(“Jenny");GraduateStudentgs(“Smith”);ds.addCourse(3,2.5);ds.display();gs.addCourse(3,3.0);gs.display();gs.getQualifier();ds.getQualifier();//error1/31/20256子類也是基類的用戶,其成員函數不能訪問基類的私有成員.但子類可以區別于外來用戶,讓基類protected成員允許子類對象訪問而不許外來對象訪問.例如,對于基類:

classFather{

inta;protected:voidfp(){cout<<a;}public:

voidprint(){cout<<a;}};外來用戶:voidfn(){Sond;d.print();//okd.disp();//okd.fp();//errorFatherf;f.print();//okf.fp();//error}子類用戶:classSon:publicFather{

intb;public:

voiddisp(){fp();//okprint();//ok}

voided(){a++;}//error};1/31/202573.構造子類對象(ConstructingObjectsofSubClass)

默認構造:

如果子類沒有構造函數,則調用默認構造函數,默認構造函數轉而先調用默認父類構造函數,完成父類對象部分的構造.

如果父類的上面還有父類,則依次遞歸.1/31/20258自定義構造:

為了規定父類構造函數的調用方式而不是默認調用,需要自定義子類構造函數,并且,在構造函數定義體的初始化列表中描述父類構造函數的調用形式.

描述形式與對象成員構造的描述一致.

GraduateStudent(conststring&pN,Advisor&adv)

:Student(pN),advisor(adv),qualifierGrade(0)

{}

1/31/20259覆蓋(overlap):

子類定義了與祖先類(父類,或者父類的父類...)名字相同的成員.

classStudent{

public:

voiddisplay();

//...

};

classGraStudent:publicStudent{

public:

voiddisplay();

//overlap

//...

};

voidfn(){

GraStudentgs;

gs.display();//callGraStudent::display()

}

捆綁子類對象訪問成員函數,則首先匹配子類,然后父類,再父類的父類,依此類推.1/31/202510拷貝構造:

子類若沒有定義拷貝構造函數,則子類對象在拷貝創建時先調用父類的拷貝構造函數,再完成自己的位對位拷貝.

父類若沒有定義拷貝構造函數,則子類對象在拷貝創建中調用父類默認的拷貝構造函數.

賦值操作符原理相似1/31/2025114.繼承方式(InheritanceMode)繼承可以公有繼承,保護繼承和私有繼承.公有繼承是普通繼承,基類可以為大多數應用服務.也可以重復繼承保護繼承是“單傳”繼承,只繼承給自己的后代,應用是以子孫的公有成員函數來對外展開服務的.私有繼承是“絕版”繼承,該基類只繼承直接的子類,而不考慮讓子類再繼承下去.1/31/202512繼承體系中,子類可以在祖先類成員可見的范圍中調整其訪問控制屬性.classA{

inta1;public:

inta2;};classB:privateA{public:

usingA::a2;//a2從私有轉為公有

usingA::a1;//錯:a1不可見};intmain(){Bd;d.a2=1;//ok}1/31/2025135.繼承與組合(Inheritance&Composition)

組合:類中含有對象成員,稱為組合式包含繼承:子類繼承了父類,稱為子類對象對父類對象的繼承式包含繼承和組合都重用了類設計.繼承重用場合,父類對象就在自己家里,無須捆綁父類對象便能對其操作.但是操作受到了父類訪問控制屬性設定的制約組合重用場合,使用對象成員的操作需捆綁對象成員,而且只能使用對象的公有成員繼承部分派生部分其他數據成員Student對象Advisor對象研究生對象組合式包含繼承式包含1/31/202514繼承型的Circle類頭文件:#include"point.h"classCircle:publicPoint{

doubleradius;public://成員函數};組合型的Circle類頭文件:#include"point.h"classCircle{Pointpoint;

doubleradius;public://成員函數};公有成員函數實現不同,但可以讓界面相同,從而不影響編程者使用繼承與組合在于實現技術不同1/31/202515使用含有繼承和組合的子類:只要外界不直接或無法直接使用該子類的祖先類成員或對象成員,僅提供公有的成員函數,則對外界來說,無所謂該子類的繼承式包含還是組合式包含(包含組合或繼承的哪種頭文件都可):#include”point.h”#include“circle.h”//組合或繼承intfn(){Circlec(Point(2.3,5.6),7);c.moveTo(1,2);c.modifyRadius(3);//…}1/31/2025166.多繼承概念(Multi-InheritanceConcept)

多繼承:一個實體,來自多個類對象的組合.因而它同時也可以繼承多個基類來實現.1/31/202517多繼承的主要技術問題:由于子類可以訪問多個基類,而基類之間沒有專門的協調,所以,基類可能出現相同的名字,這于子類來說,要訪問這種名字增加了編程的復雜性,不得不要在名字前加上前綴.然而,這種同名也許意義相同,操作這種名字本身便是一種分別性操作,不合邏輯.于是便尋求一種分離共性,統一基類的解決辦法(見CH12.5).但是,不同的父類擁有共性基類,訪問基類成員仍然存在相同名字沖突問題.1/31/2025187.多繼承技術(Multi-InheritanceTechnology)

解決多繼承基類名字沖突問題1將多個父類看成同一基類下的不同子類,而所需要派生的子類來自于這些不同子類.于是形成一個棱形結構.Bed

sleep()Sofa

watchTV()SleeperSofa

FoldOut()Furniture

weightgetWeight()setWeight()1/31/2025192多個不同子類(如,床、沙發)在繼承基類的方式上采取虛擬繼承,它的作用是,當對象創建上產生基類重疊時,略去重復產生基類對象空間的行為:

classBed:virtualpublic

溫馨提示

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

評論

0/150

提交評論