




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第十一章 派生類與繼承C/C+語言程序設(shè)計龔尚福,賈澎濤主編C/C+語言程序設(shè)計西安電子科技大學(xué)出版社第1頁,共46頁。第十一章 派生類與繼承11.1類的繼承與派生11.2 派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)11.3 多重繼承11.4 虛基類11.5 小結(jié)第2頁,共46頁。 繼承是C+的一種重要機制,是程序可重用與擴充的一個重要方面。這一機制使得程序員可以在已有類的基礎(chǔ)上建立新類。從而擴展程序功能、體現(xiàn)類的多態(tài)性特征。 第3頁,共46頁。11.1 類的繼承與派生自然世界的類概念是抽象的,類的下面還有子類,子類繼承父類的各種特征。面向?qū)ο蟪绦蛟O(shè)計允許你聲明一個新類作為另一個類的派生。派生類(也稱子類)可
2、以聲明新的屬性(成員)和新的操作(成員函數(shù))。繼承可以讓你重用父類代碼,專注于為子類編寫新代碼。我們稱最初的類為基類,根據(jù)它生成的類稱為派生類(子類),這種派生可以是多層次的。11.1.1 繼承與派生的概念第4頁,共46頁。哺乳動物類貓類犬類波斯貓安哥拉貓西施犬沙皮犬第5頁,共46頁。為什么要使用繼承?例如:class personprivate: char name10; int age; char sex;public: void print();class employeeprivate: char name10; int age; char sex; char department20
3、; float salary;public: void print();第6頁,共46頁。11.1.2 派生類的聲明聲明一個派生類的一般格式為:class 派生類名:派生方式 基類名/派生類新增的數(shù)據(jù)成員和成員函數(shù)“保護成員”是由protected聲明的類成員。保護成員不能被外界引用,這點和私有成員類似,但它可以被派生類的成員函數(shù)引用。下面用派生關(guān)系改寫person和employee類。第7頁,共46頁。基類class personprivate: char name10; int age; char sex;public: void print();第8頁,共46頁。派生類class emp
4、loyee:public personprivate: char department20; float salary;public: /第9頁,共46頁。派生方式公有派生class employee:public person /私有派生class employee:private person /保護派生class employee:protected person /第10頁,共46頁。特點:公有繼承:基類的公有成員和保護成員作為派生類的成員時,它們都保持原有的狀態(tài),而基類的私有成員仍然是私有的。保護繼承:基類的所有公有成員和保護成員都成為派生類的保護成員,并且只能被它的派生類成員函數(shù)或
5、友元訪問,基類的私有成員仍然是私有的。私有繼承:基類的公有成員和保護成員都作為派生類的私有成員,并且不能被這個派生類的子類所訪問。缺省繼承方式為private.第11頁,共46頁。繼承方式基類特性派生類特性公有繼承PublicprotectedprivatePublicProtected不可訪問私有繼承PublicprotectedprivatePrivatePrivate不可訪問保護繼承PublicprotectedprivateProtectedProtected不可訪問第12頁,共46頁。例11.1 派生類對基類的訪問特性。#include class Apublic:void f1()
6、;protected:int j1;private:int i1; class B:public Apublic:void fn2();protected:int j2;private:int i2; class C:public B public:void f3();第13頁,共46頁。問題:1. B中成員函數(shù)f2()能否訪問基類中的成員:f1(),i1,j1?2. B的對象b1能否訪問的成員?3.的成員函數(shù)f3()能否訪問直接基類B中的成員:f2(),i2,j2?4. 派生類C的對象c1是否可以訪問直接基類B的成員?能否訪問間接其類A的成員:f1(),i1,j1? 第14頁,共46頁。回答
7、:1. 可以訪問f1(),j1,不可訪問i1;2. 可以訪問f1(),不可訪問i1,j1;3. 可以訪問f2(),j2,f1(),j1,不可訪問i1,i2;4. 可以訪問f2(),f1(),其他的都不可以訪問;結(jié)論:在公有繼承時,派生類的成員函數(shù)可訪問基類中的公有成員和保護成員;派生類的對象僅可訪問基類中的公有成員。 第15頁,共46頁。【例11.2 】私有派生類對基類成員的訪問。#include class base /聲明一個基類 int x;public: void setx(int n) x=n; void showx() coutxendl; class derived:privat
8、e base /聲明一個私有派生類 int y;public: void sety(int n) y=n; void showxy() coutxyendl; /非法,派生類不能訪問基類的私有成員; 第16頁,共46頁。【例 11.3 】私有派生類對基類成員的訪問。#include class base int x;public: void setx(int n) x=n; void showx() coutxendl; class derived:private base int y;public: void sety(int n) y=n; void showy() coutyendl;
9、第17頁,共46頁。main() derived obj; obj.setx(10); /非法 obj.sety(20); /合法 obj.showx(); /非法 obj.showy(); /合法 return 0;如果將derived類改為公有派生,則main函數(shù)中的調(diào)用合法否?(例11.4)如果將derived類改為保護派生,則main函數(shù)中的調(diào)用合法否?(例11.4)思考第18頁,共46頁。在派生類中聲明的名字可以支配基類中聲明的同名的名字。如果在派生類的成員函數(shù)中直接使用該名字的話,則表示使用派生類中聲明的名字,例如:class Xpublic:int f();class Y:pub
10、lic Xpublic:int f();int g();void Y:g() f(); /表示被調(diào)用的函數(shù)是Y:f(),而不是X:f()第19頁,共46頁。11.2 派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù) 基類都有顯示的或隱式的構(gòu)造函數(shù)和析構(gòu)函數(shù)。當創(chuàng)建一個派生類對象時,如何調(diào)用基類的構(gòu)造函數(shù)對基類數(shù)據(jù)初始化,以及在撤銷派生類對象時,又如何調(diào)用基類的析構(gòu)函數(shù)對基類對象的數(shù)據(jù)成員進行善后處理,是本節(jié)所要討論的內(nèi)容。第20頁,共46頁。11.2.1構(gòu)造和析構(gòu)的次序通常情況下,當創(chuàng)建派生類時,首先執(zhí)行基類的構(gòu)造函數(shù),隨后再執(zhí)行派生類的構(gòu)造函數(shù);當撤銷派生類對象時,則先執(zhí)行派生類的析構(gòu)函數(shù),隨后再執(zhí)行基類的析構(gòu)函
11、數(shù)。參見例11.6第21頁,共46頁。【例11. 6】 掌握基類和派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)的執(zhí)行順序。#include class basepublic:base() cout基類的構(gòu)造函數(shù)endl;base() cout基類的析構(gòu)函數(shù)endl;class derive: public basepublic:derive() cout派生類的構(gòu)造函數(shù)endl;derive() cout派生類類的析構(gòu)函數(shù)endl;main()derive op;return 0;第22頁,共46頁。11.2.2派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)的構(gòu)造規(guī)則派生類構(gòu)造函數(shù)的一般格式:在定義派生類對象時,構(gòu)造函數(shù)的執(zhí)行順序
12、如下: (1)基類的構(gòu)造函數(shù) (2)對象成員的構(gòu)造函數(shù) (3)派生類的構(gòu)造函數(shù)例11.7派生類構(gòu)造函數(shù)名(參數(shù)表):基類構(gòu)造函數(shù)名(參數(shù)表),對象成員名1(參數(shù)表),對象成員名n(參數(shù)表) 派生類中其它數(shù)據(jù)成員初始化 第23頁,共46頁。【例11.7 】派生類構(gòu)造函數(shù)給基類構(gòu)造函數(shù)傳遞參數(shù)。#include class baseint x;public: base(int a) cout基類的構(gòu)造函數(shù)endl; x=a; base() cout基類的析構(gòu)函數(shù)endl; void showx() coutxendl; ; 第24頁,共46頁。class derived:public basein
13、t y;public:derived(int a,int b):base(a) /派生類的構(gòu)造函數(shù),要綴上基類的構(gòu)造函數(shù) cout派生類的構(gòu)造函數(shù)endl; y=b; derived() cout派生類的析構(gòu)函數(shù)endl; void showy() coutyendl;void main() derived obj(10,20); obj.showx(); obj.showy(); return 0;第25頁,共46頁。含有對象成員的派生類構(gòu)造函數(shù)當派生類中含有對象成員時,派生類必須負責該對象成員的構(gòu)造,其構(gòu)造函數(shù)的一般形式為:派生類構(gòu)造函數(shù)名(參數(shù)表):基類構(gòu)造函數(shù)名(參數(shù)表), 對象成員名
14、1(參數(shù)表), 對象成員名n(參數(shù)表) /第26頁,共46頁。【例11.8 】含有對象成員的派生類構(gòu)造函數(shù)的執(zhí)行情況#include class baseint x;public: base(int a) cout基類的構(gòu)造函數(shù)endl; x=a; base() cout基類的析構(gòu)函數(shù)endl; void showx() coutxendl; ; 第27頁,共46頁。class derived:public basepublic:base d; /d為基類對象,作為派生類的對象成員derived(int a,int b):base(a),d(b) /派生類的構(gòu)造函數(shù),綴上基類構(gòu)造函數(shù)/和對象成
15、員的構(gòu)造函數(shù) cout派生類的構(gòu)造函數(shù)endl; derived() cout派生類的析構(gòu)函數(shù)endl; ;void main() derived obj(10,20); obj.showx(); obj.d.showx(); 第28頁,共46頁。說明當基類的構(gòu)造函數(shù)不帶參數(shù)時,派生類不一定需要定義構(gòu)造函數(shù),然而當基類的構(gòu)造函數(shù)那怕只帶有一個參數(shù),它所有的派生類都必須定義構(gòu)造函數(shù),甚至所定義的派生類的構(gòu)造函數(shù)的函數(shù)體有可能為空,僅僅起到參數(shù)傳遞作用。若基類使用缺省構(gòu)造函數(shù)或不帶參數(shù)的構(gòu)造函數(shù),則在派生類中定義構(gòu)造函數(shù)時可略去,此時若派生類也不需要構(gòu)造函數(shù),則可以不定義構(gòu)造函數(shù)。如果派生類的基類
16、也是一個派生類,則每個派生類只需要負責直接基類的構(gòu)造。由于析構(gòu)函數(shù)是不帶參數(shù)的,在派生類中是否要定義析構(gòu)函數(shù)與它所屬的基類無關(guān)。第29頁,共46頁。11.3 多重繼承多重繼承: 一個派生類具有多個基類。 在多重繼承中,公有繼承和私有繼承對于基類成員在派生類中的可訪問性與單繼承相同。 玩具車玩具車class 派生類名:繼承方式1 基類名1,繼承方式n 基類名n 派生類新定義成員 ;11.3.1 多重繼承的聲明第30頁,共46頁。例11.9 聲明多重派生。#includeclass Xint a;public:void setX(int x)a=x;void showX() couta=aendl
17、;class Yint b;public:void setY(int y)b=y;void showY() coutb=bendl;第31頁,共46頁。class Z:public X,private Yint c;public:void setZ(int x,int y)c=x;setY(y);void showZ() showY();coutc=cendl;void main()Z obj;obj.setX(3);obj.showX();/obj.setY(4);/obj.showY();obj.setZ(6,8);obj.showZ();第32頁,共46頁。二義性對基類成員的訪問必須是無
18、二義性的。消除下例中的二義性,可寫為obj.X:f(); /調(diào)用類X的f()obj.X:f(); /調(diào)用類Y的f()第33頁,共46頁。例11.10多重繼承時,對基類訪問存在二義性的情況。#includeclass base1public:void show() ;class base2public:void show() ;class derive:public base1, private base2public:void showderive () ;void main()derive obj;obj.show(); /二義性錯誤,不知調(diào)用的是 /base1的show() /還是base
19、2的show() 第34頁,共46頁。11.3.2 多重繼承的構(gòu)造函數(shù)多重繼承構(gòu)造函數(shù)定義的一般形式如下:派生類構(gòu)造函數(shù)名(參數(shù)表):基類構(gòu)造函數(shù)名1(參數(shù)表),基類構(gòu)造函數(shù)名2(參數(shù)表),基類構(gòu)造函數(shù)名n(參數(shù)表) /派生類中其它數(shù)據(jù)成員初始化 第35頁,共46頁。【例11.8 】含有對象成員的派生類構(gòu)造函數(shù)的執(zhí)行情況。#include class baseint x;public: base(int a) cout基類的構(gòu)造函數(shù)endl; x=a; base() cout基類的析構(gòu)函數(shù)endl; void showx() coutxendl; ; 第36頁,共46頁。class deriv
20、ed:public basepublic:base d; /d為基類對象,作為派生類的對象成員derived(int a,int b):base(a),d(b) /派生類的構(gòu)造函數(shù),綴上基類構(gòu)造函數(shù)/和對象成員的構(gòu)造函數(shù) cout派生類的構(gòu)造函數(shù)endl; derived() cout派生類的析構(gòu)函數(shù)endl; ;void main() derived obj(10,20); obj.showx(); obj.d.showx(); 第37頁,共46頁。11.4 虛基類當引用派生類的成員時,首先在派生類自身的作用域中尋找這個成員,如果沒有找到,則在它的基類中尋找。如果一個派生類是從多個基類派生出
21、來的,而這些基類又有一個共同的基類,則在這個派生類中訪問這個共同的基類中的成員時,可能會產(chǎn)生二義性。virtual 關(guān)鍵字,同繼承方式關(guān)鍵字的先后順序無關(guān)緊要。第38頁,共46頁。【例11.12 】多重派生產(chǎn)生二義性的情況#includeclass baseprotected:int a;public:base()a=5;class base1:public basepublic:base1()coutbase1 a=aendl;class base2:public basepublic:base2()coutbase2 a=aendl;class derived:public base1,public base2public:derived()coutderived a=aendl;main()derived obj;return 0; 第39頁,共46頁。derivedbase1base2basebase非虛基類的類層次圖第40頁,共46頁。如果采用虛基類,則會消除二義性derivedbase1base2base 虛基類的類層次圖第4
溫馨提示
- 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)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023一年級數(shù)學(xué)上冊 六 認識圖形第2課時 我說你做教學(xué)設(shè)計 北師大版
- 2023七年級英語下冊 Unit 7 It's raining Section A 第1課時(1a-2d)教學(xué)設(shè)計 (新版)人教新目標版
- 七年級地理上冊 第三章 第三節(jié) 降水的變化與分布教學(xué)設(shè)計3 (新版)新人教版
- 2024-2025學(xué)年高中物理 第二章 機械波 5 波的干涉、衍射教學(xué)設(shè)計2 教科版選修3-4
- 10我們愛和平 教學(xué)設(shè)計
- 4《少讓父母為我操心》教學(xué)設(shè)計-2023-2024學(xué)年道德與法治四年級上冊統(tǒng)編版
- 2024八年級英語下冊 Unit 1 Spring Is ComingLesson 2 It's Getting Warmer教學(xué)設(shè)計(新版)冀教版
- 三年級信息技術(shù)下冊 第5課《描繪美麗的大自然》教學(xué)設(shè)計2 川教版
- 13 精衛(wèi)填海教學(xué)設(shè)計-2024-2025學(xué)年四年級上冊語文統(tǒng)編版
- 2024秋三年級英語上冊 Module 4 Unit 2 Its black dog教學(xué)設(shè)計 外研版(三起)
- 公安審訊技巧課件
- CSSD滅菌物品召回管理
- 4.1 公民基本義務(wù)課件 2024-2025學(xué)年統(tǒng)編版道德與法治八年級下冊
- 第三單元第三課信息檢索的方法教學(xué)設(shè)計 2024-2025學(xué)年西交大版(2024)初中信息技術(shù)七年級上冊
- 2025廣德輔警考試題庫
- 軟件開發(fā)java筆試題及答案
- 小學(xué)綜合實踐三年級下冊巧手工藝坊教學(xué)課件
- 2025年紹興職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫帶答案
- DB61T 5113-2024 建筑施工全鋼附著式升降腳手架安全技術(shù)規(guī)程
- 2025年供水安全考試試題及答案
- 腹外疝圍手術(shù)期護理
評論
0/150
提交評論