第11-1章 繼承與派生_第1頁(yè)
第11-1章 繼承與派生_第2頁(yè)
第11-1章 繼承與派生_第3頁(yè)
第11-1章 繼承與派生_第4頁(yè)
第11-1章 繼承與派生_第5頁(yè)
已閱讀5頁(yè),還剩28頁(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)介

1、第第11章章 繼承與派生繼承與派生11.1 繼承與派生的概念繼承與派生的概念11.2 派生類的聲明方式派生類的聲明方式11.3 派生類的構(gòu)成派生類的構(gòu)成11.4 派生類成員的訪問(wèn)屬性派生類成員的訪問(wèn)屬性11.5 派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)11.6 多重繼承多重繼承 11.1 繼承與派生的概念繼承與派生的概念u在在C+中可重用性是通過(guò)繼承中可重用性是通過(guò)繼承(inheritance)這一機(jī)這一機(jī)制來(lái)實(shí)現(xiàn)的。繼承是制來(lái)實(shí)現(xiàn)的。繼承是C+的一個(gè)重要組成部分。的一個(gè)重要組成部分。u一個(gè)類中包含了若干數(shù)據(jù)成員和成員函數(shù)。在不同一個(gè)類中包含了若干數(shù)據(jù)成員和成員函數(shù)。在不同的類中,

2、數(shù)據(jù)成員和成員函數(shù)是不相同的。但有時(shí)兩的類中,數(shù)據(jù)成員和成員函數(shù)是不相同的。但有時(shí)兩個(gè)類的內(nèi)容基本相同或有一部分相同。個(gè)類的內(nèi)容基本相同或有一部分相同。u利用原來(lái)聲明的類作為基礎(chǔ),再加上新的內(nèi)容即可,利用原來(lái)聲明的類作為基礎(chǔ),再加上新的內(nèi)容即可,以減少重復(fù)的工作量。以減少重復(fù)的工作量。 C+提供的繼承機(jī)制就是為提供的繼承機(jī)制就是為了解決這個(gè)問(wèn)題。了解決這個(gè)問(wèn)題。在在C+中,所謂中,所謂“繼承繼承”就是在一個(gè)已存在的類的基就是在一個(gè)已存在的類的基礎(chǔ)上建立一個(gè)新的類。已存在的類礎(chǔ)上建立一個(gè)新的類。已存在的類(例如例如“馬馬”)稱為稱為“基類基類(base class)”或或“父類父類(father

3、 class)”。新建。新建立的類立的類(例如例如“公馬公馬”)稱為稱為“派生類派生類(derived class)”或或“子類子類(son class)”。u一個(gè)新類從已有的類那里獲得其已有特性,這種一個(gè)新類從已有的類那里獲得其已有特性,這種現(xiàn)象稱為類的繼承?,F(xiàn)象稱為類的繼承。u通過(guò)繼承,一個(gè)新建子類從已有的父類那里獲得通過(guò)繼承,一個(gè)新建子類從已有的父類那里獲得父類的特性。父類的特性。u派生類繼承了基類的所有數(shù)據(jù)成員和成員函數(shù),派生類繼承了基類的所有數(shù)據(jù)成員和成員函數(shù),并可以對(duì)成員作必要的增加或調(diào)整。并可以對(duì)成員作必要的增加或調(diào)整。u一個(gè)基類可以派生出多個(gè)派生類,每一個(gè)派生類一個(gè)基類可以派生

4、出多個(gè)派生類,每一個(gè)派生類又可以作為基類再派生出新的派生類,因此基類和又可以作為基類再派生出新的派生類,因此基類和派生類是相對(duì)而言的。派生類是相對(duì)而言的。u以上介紹的是最簡(jiǎn)單的情況以上介紹的是最簡(jiǎn)單的情況: 一個(gè)派生類只從一個(gè)一個(gè)派生類只從一個(gè)基類派生,這稱為單繼承基類派生,這稱為單繼承(single inheritance),這種,這種繼承關(guān)系所形成的層次是一個(gè)樹(shù)形結(jié)構(gòu),可以用圖繼承關(guān)系所形成的層次是一個(gè)樹(shù)形結(jié)構(gòu),可以用圖表示。表示。u一個(gè)派生類不僅可以從一個(gè)基類派生,也可以從多一個(gè)派生類不僅可以從一個(gè)基類派生,也可以從多個(gè)基類派生。一個(gè)派生類有兩個(gè)或多個(gè)基類的稱為多個(gè)基類派生。一個(gè)派生類有

5、兩個(gè)或多個(gè)基類的稱為多重繼承重繼承(multiple inheritance)。u關(guān)于基類和派生類的關(guān)系,可以表述為關(guān)于基類和派生類的關(guān)系,可以表述為: 派生類是基派生類是基類的具體化,而基類則是派生類的抽象。類的具體化,而基類則是派生類的抽象。11.2 派生類的聲明方式派生類的聲明方式假設(shè)已經(jīng)聲明了一個(gè)基類假設(shè)已經(jīng)聲明了一個(gè)基類Student,在此基礎(chǔ)上通過(guò),在此基礎(chǔ)上通過(guò)單繼承建立一個(gè)派生類單繼承建立一個(gè)派生類Student1:class Student1: public Student/聲明基類是聲明基類是Studentpublic:void display_1( ) /新增加的成員函數(shù)

6、新增加的成員函數(shù)coutage: ageendl;coutaddress: addrnumnamesex;void display( )cout num: numendl;cout name: nameendl;cout sex: sexendl;private : /基類私有成員 int num; string name; char sex; class Student1: public Student /以public方式聲明派生類Student1public:void display_1( )cout num: numendl; /企圖引用基類的私有成員,錯(cuò)誤企圖引用基類的私有成員,錯(cuò)誤

7、 cout name: nameendl; /企圖引用基類的私有成員,錯(cuò)誤企圖引用基類的私有成員,錯(cuò)誤 cout sex: sexendl; /企圖引用基類的私有成員,錯(cuò)誤企圖引用基類的私有成員,錯(cuò)誤 cout age: ageendl; /引用派生類的私有成員,正確引用派生類的私有成員,正確 cout address: addrendl; /引用派生類的私有成員,正確引用派生類的私有成員,正確private: int age; string addr; ;可以將派生類可以將派生類Student1的聲明改為的聲明改為class Student1: public Student/以以public

8、方式聲明派生類方式聲明派生類Student1public:void display_1( ) cout age: ageendl; /引用派生類的私有成員,正確引用派生類的私有成員,正確cout address: addrendl; /引用派生類的私有成員,正確引用派生類的私有成員,正確private:int age; string addr;int main( )Student1 stud;/定義派生類定義派生類Student1的對(duì)象的對(duì)象studstud.display( ); /調(diào)用基類的公用成員函數(shù),輸出基類中調(diào)用基類的公用成員函數(shù),輸出基類中3個(gè)數(shù)據(jù)成員的值個(gè)數(shù)據(jù)成員的值stud.d

9、isplay_1(); /調(diào)用派生類的公用成員函數(shù),輸出派生類中兩個(gè)數(shù)據(jù)成員的調(diào)用派生類的公用成員函數(shù),輸出派生類中兩個(gè)數(shù)據(jù)成員的值值return 0; 11.4.2 私有繼承私有繼承u在聲明一個(gè)派生類時(shí)將基類的繼承方式指定為在聲明一個(gè)派生類時(shí)將基類的繼承方式指定為private的,稱為私有繼承,用私有繼承方式建立的的,稱為私有繼承,用私有繼承方式建立的派生類稱為私有派生類派生類稱為私有派生類(private derived class) ,其基類稱為私有基類其基類稱為私有基類(private base class)。公用基類的成員私有成員公有成員保護(hù)成員在私有派生類中的訪問(wèn)屬性不可訪問(wèn)私有私

10、有例例11.2 將例將例11.1中的公用繼承方式改為用私有繼承方中的公用繼承方式改為用私有繼承方式式(基類基類Student不改不改)。可以寫(xiě)出私有派生類如下可以寫(xiě)出私有派生類如下:class Student1: private Student/用私有繼承方式聲明派生類用私有繼承方式聲明派生類Student1public:void display_1( ) /輸出兩個(gè)數(shù)據(jù)成員的值輸出兩個(gè)數(shù)據(jù)成員的值coutage: ageendl; /引用派生類的私有成員,正確引用派生類的私有成員,正確coutaddress: addrendl; /引用派生類的私有成員,正確引用派生類的私有成員,正確priv

11、ate:int age; string addr;請(qǐng)分析下面的主函數(shù)請(qǐng)分析下面的主函數(shù):int main( )Student1 stud1;/定義一個(gè)定義一個(gè)Student1類的對(duì)象類的對(duì)象stud1 stud1.display(); /錯(cuò)誤,私有基類的公用成員函數(shù)在派生類中是私有函數(shù)錯(cuò)誤,私有基類的公用成員函數(shù)在派生類中是私有函數(shù)stud1.display_1( ); /正確。正確。Display_1函數(shù)是函數(shù)是Student1類的公用函數(shù)類的公用函數(shù)stud1.age=18; /錯(cuò)誤。外界不能引用派生類的私有成員錯(cuò)誤。外界不能引用派生類的私有成員return 0; 11.4.3 保護(hù)成員和

12、保護(hù)繼承保護(hù)成員和保護(hù)繼承由由protected聲明的成員稱為聲明的成員稱為“受保護(hù)的成員受保護(hù)的成員”,或,或簡(jiǎn)稱簡(jiǎn)稱“保護(hù)成員保護(hù)成員”。從類的用戶角度來(lái)看,保護(hù)成員。從類的用戶角度來(lái)看,保護(hù)成員等價(jià)于私有成員。但有一點(diǎn)與私有成員不同,保護(hù)成等價(jià)于私有成員。但有一點(diǎn)與私有成員不同,保護(hù)成員可以被派生類的成員函數(shù)引用。員可以被派生類的成員函數(shù)引用。u在定義一個(gè)派生類時(shí)將基類的繼承方式指定為在定義一個(gè)派生類時(shí)將基類的繼承方式指定為protected的,稱為保護(hù)繼承,用保護(hù)繼承方式建立的,稱為保護(hù)繼承,用保護(hù)繼承方式建立的派生類稱為保護(hù)派生類的派生類稱為保護(hù)派生類(protected deriv

13、ed class),其基類稱為受保護(hù)的基類其基類稱為受保護(hù)的基類(protected base class),簡(jiǎn)稱保護(hù)基類。簡(jiǎn)稱保護(hù)基類。公用基類的成員私有成員公有成員保護(hù)成員在保護(hù)派生類中的訪問(wèn)屬性不可訪問(wèn)保護(hù)保護(hù)例例11.3 在派生類中引用保護(hù)成員。在派生類中引用保護(hù)成員。#include #include using namespace std;class Student/聲明基類聲明基類public: /基類公用成員基類公用成員 void display( ); protected : /基類保護(hù)成員基類保護(hù)成員int num;string name;char sex;void Stu

14、dent:display( ) /定義基類成員函數(shù)定義基類成員函數(shù) coutnum: numendl; coutname: nameendl; coutsex: sexendl; class Student1: protected Student /用用protected方式聲明派生類方式聲明派生類Student1public:void display1( ); /派生類公用成員函數(shù)派生類公用成員函數(shù)private:int age; /派生類私有數(shù)據(jù)成員派生類私有數(shù)據(jù)成員string addr; /派生類私有數(shù)據(jù)成員派生類私有數(shù)據(jù)成員;void Student1:display1( ) /定義

15、派生類公用成員函數(shù)定義派生類公用成員函數(shù) coutnum: numendl; /引用基類的保護(hù)成員,合法引用基類的保護(hù)成員,合法 coutname: nameendl; /引用基類的保護(hù)成員,合法引用基類的保護(hù)成員,合法 coutsex: sexendl; /引用基類的保護(hù)成員,合法引用基類的保護(hù)成員,合法 coutage: ageendl; /引用派生類的私有成員,合法引用派生類的私有成員,合法 coutaddress: addrendl; /引用派生類的私有成員,合法引用派生類的私有成員,合法 int main( ) Student1 stud1; /stud1是派生類是派生類Studen

16、t1類的對(duì)象類的對(duì)象 stud1.display1( ); /合法,合法,display1是派生類中的公用成員函數(shù)是派生類中的公用成員函數(shù) stud1.num=10023; /錯(cuò)誤,外界不能訪問(wèn)保護(hù)成員錯(cuò)誤,外界不能訪問(wèn)保護(hù)成員return 0; 在派生類中,成員有在派生類中,成員有4種不同的訪問(wèn)屬性種不同的訪問(wèn)屬性: 公用的,派生類內(nèi)和派生類外都可以訪問(wèn)。公用的,派生類內(nèi)和派生類外都可以訪問(wèn)。 受保護(hù)的,派生類內(nèi)可以訪問(wèn),派生類外不能訪受保護(hù)的,派生類內(nèi)可以訪問(wèn),派生類外不能訪問(wèn),其下一層的派生類可以訪問(wèn)。問(wèn),其下一層的派生類可以訪問(wèn)。 私有的,派生類內(nèi)可以訪問(wèn),派生類外不能訪問(wèn)。私有的,派

17、生類內(nèi)可以訪問(wèn),派生類外不能訪問(wèn)。 不可訪問(wèn)的,派生類內(nèi)和派生類外都不能訪問(wèn)不可訪問(wèn)的,派生類內(nèi)和派生類外都不能訪問(wèn)11.5 派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)u構(gòu)造函數(shù)的主要作用是對(duì)數(shù)據(jù)成員初始化。在設(shè)計(jì)構(gòu)造函數(shù)的主要作用是對(duì)數(shù)據(jù)成員初始化。在設(shè)計(jì)派生類的構(gòu)造函數(shù)時(shí),不僅要考慮派生類所增加的數(shù)派生類的構(gòu)造函數(shù)時(shí),不僅要考慮派生類所增加的數(shù)據(jù)成員的初始化,還應(yīng)當(dāng)考慮基類的數(shù)據(jù)成員初始化。據(jù)成員的初始化,還應(yīng)當(dāng)考慮基類的數(shù)據(jù)成員初始化。也就是說(shuō),希望在執(zhí)行派生類的構(gòu)造函數(shù)時(shí),使派生也就是說(shuō),希望在執(zhí)行派生類的構(gòu)造函數(shù)時(shí),使派生類的數(shù)據(jù)成員和基類的數(shù)據(jù)成員同時(shí)都被初始化。類的數(shù)據(jù)

18、成員和基類的數(shù)據(jù)成員同時(shí)都被初始化。u解決這個(gè)問(wèn)題的思路是解決這個(gè)問(wèn)題的思路是: 在執(zhí)行派生類的構(gòu)造函數(shù)在執(zhí)行派生類的構(gòu)造函數(shù)時(shí),調(diào)用基類的構(gòu)造函數(shù)。時(shí),調(diào)用基類的構(gòu)造函數(shù)。11.5.1 簡(jiǎn)單的派生類的構(gòu)造函數(shù)簡(jiǎn)單的派生類的構(gòu)造函數(shù)例例11.5 簡(jiǎn)單的派生類的構(gòu)造函數(shù)。簡(jiǎn)單的派生類的構(gòu)造函數(shù)。#include #includeusing namespace std;class Student/聲明基類聲明基類Student public: Student(int n,string nam,char s) /基類構(gòu)造函數(shù)基類構(gòu)造函數(shù) num=n; name=nam; sex=s; Student

19、( ) /基類析構(gòu)函數(shù)基類析構(gòu)函數(shù)protected: /保護(hù)部分保護(hù)部分 int num; string name; char sex ; ;class Student1: public Student /聲明派生類聲明派生類Student1 public: /派生類的公用部分派生類的公用部分 Student1(int n,string nam,char s,int a,string ad):Student(n,nam,s) /派生類構(gòu)造函數(shù)派生類構(gòu)造函數(shù)age=a; /在函數(shù)體中只對(duì)派生類新增的數(shù)據(jù)成員初始化在函數(shù)體中只對(duì)派生類新增的數(shù)據(jù)成員初始化 addr=ad; void show(

20、) coutnum: numendl; coutname: nameendl; coutsex: sexendl; coutage: ageendl; coutaddress: addrendlendl; Student1( ) /派生類析構(gòu)函數(shù)派生類析構(gòu)函數(shù) private: /派生類的私有部分派生類的私有部分int age; string addr; ;int main( ) Student1 stud1(10010,Wang-li,f,19,115 Beijing Road,Shanghai); Student1 stud2(10011,Zhang-fun,m,21,213 Shangh

21、ai Road,Beijing); stud1.show( ); /輸出第一個(gè)學(xué)生的數(shù)據(jù)輸出第一個(gè)學(xué)生的數(shù)據(jù) stud2.show( ); /輸出第二個(gè)學(xué)生的數(shù)據(jù)輸出第二個(gè)學(xué)生的數(shù)據(jù) return 0;運(yùn)行結(jié)果為運(yùn)行結(jié)果為num:10010name:Wang-lisex:faddress: 115 Beijing Road,Shanghainum:10011name:Zhang-funsex:maddress: 213 Shanghai Road,Beijing請(qǐng)注意派生類構(gòu)造函數(shù)首行的寫(xiě)法請(qǐng)注意派生類構(gòu)造函數(shù)首行的寫(xiě)法:Student1(int n,string nam,char s,int

22、 a,string ad):Student(n,nam,s)其一般形式為其一般形式為派生類構(gòu)造函數(shù)名(總參數(shù)表列)派生類構(gòu)造函數(shù)名(總參數(shù)表列): 基類構(gòu)造函數(shù)名基類構(gòu)造函數(shù)名(參數(shù)表列)(參數(shù)表列) 派生類中新增數(shù)據(jù)成員初始化語(yǔ)句派生類中新增數(shù)據(jù)成員初始化語(yǔ)句例例11.5中派生類的基類構(gòu)造函數(shù)的定義采用了下面中派生類的基類構(gòu)造函數(shù)的定義采用了下面的形式的形式:Student1(int n, string nam,char s,int a, string ad):Student(n,nam,s) age=a;/在函數(shù)體中對(duì)派生類數(shù)據(jù)成員初始化在函數(shù)體中對(duì)派生類數(shù)據(jù)成員初始化 addr=ad; 可以將對(duì)可以將對(duì)age和和addr的初始化也用初始化表處理,將的初始化也用初始化表處理,將構(gòu)造函

溫馨提示

  • 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)論