c++學(xué)習(xí)7(清華大學(xué)第五版)教學(xué)課件_第1頁(yè)
c++學(xué)習(xí)7(清華大學(xué)第五版)教學(xué)課件_第2頁(yè)
c++學(xué)習(xí)7(清華大學(xué)第五版)教學(xué)課件_第3頁(yè)
c++學(xué)習(xí)7(清華大學(xué)第五版)教學(xué)課件_第4頁(yè)
c++學(xué)習(xí)7(清華大學(xué)第五版)教學(xué)課件_第5頁(yè)
已閱讀5頁(yè),還剩41頁(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)介

第七章繼承與派生C++語(yǔ)言程序設(shè)計(jì)1c++學(xué)習(xí)7(清華大學(xué)第五版)繼承與派生的概念

繼承就是從一個(gè)類(lèi)中繼承它的特性到另一個(gè)類(lèi)中。被繼承的類(lèi)叫做基類(lèi),繼承基類(lèi)的類(lèi)稱(chēng)為派生類(lèi)。派生類(lèi)可以繼承基類(lèi)的特性并添加自己的獨(dú)特特性。2c++學(xué)習(xí)7(清華大學(xué)第五版)●繼承是自然界的一個(gè)普遍的重要特性?!衽缮剐骂?lèi)在繼承共性的同時(shí),具有了更加豐富多彩的個(gè)性。3c++學(xué)習(xí)7(清華大學(xué)第五版)例:定義交通工具類(lèi),并從交通工具類(lèi)派生出小汽車(chē)類(lèi)和卡車(chē)類(lèi)

現(xiàn)實(shí)世界的事物多種多樣,許多事物都存在著層次關(guān)系,這種層次關(guān)系使我們找到了描述事物的解決方法。如下圖是關(guān)于交通工具的一個(gè)分類(lèi)層次關(guān)系圖。4c++學(xué)習(xí)7(清華大學(xué)第五版)

●類(lèi)的層次結(jié)構(gòu)圖中,下層類(lèi)是上層類(lèi)的特殊類(lèi);

●下層類(lèi)自動(dòng)具有上層類(lèi)的特性,同時(shí)也具有自身新的特性;

●越往層次結(jié)構(gòu)圖的下層,其特性越具體化

●這種從上到下的層次結(jié)構(gòu)關(guān)系體現(xiàn)了繼承與派生的過(guò)程;

C++面向?qū)ο蠹夹g(shù)也采用了這種繼承機(jī)制。類(lèi)的層次結(jié)構(gòu)關(guān)系總結(jié)5c++學(xué)習(xí)7(清華大學(xué)第五版)派生類(lèi)

●派生類(lèi)是在基類(lèi)的基礎(chǔ)上產(chǎn)生的特殊類(lèi),派生類(lèi)自動(dòng)繼承了基類(lèi)的成員;●派生類(lèi)具有自身的屬性和行為,不然就完全等同于基類(lèi),這樣就沒(méi)有必要派生新類(lèi);●繼承是為了避免代碼的重復(fù);●派生是為了使新產(chǎn)生的派生類(lèi)除具有基類(lèi)的共性之外,還具有其他個(gè)性。6c++學(xué)習(xí)7(清華大學(xué)第五版)單繼承的定義格式為:class

派生類(lèi)名:繼承方式基類(lèi)名

{

派生類(lèi)新定義成員

};

1.派生類(lèi)的定義格式public:公有派生private:私有派生protected:保護(hù)派生規(guī)定基類(lèi)成員在派生類(lèi)中的訪問(wèn)權(quán)限缺省情況下表示private方式。7c++學(xué)習(xí)7(清華大學(xué)第五版)classStudent{public:voiddisplay(){};private:intnum;

charname[10]; charsex;};基類(lèi)定義8c++學(xué)習(xí)7(清華大學(xué)第五版)classStudent1:publicStudent{public:voiddisplay()//改造的成員函數(shù)

{cout<<"age:"<<age<<endl;cout<<"address:"<<addr<<endl;}private:intage; //新增加的數(shù)據(jù)成員

charaddr[30];//新增加的數(shù)據(jù)成員};派生類(lèi)的定義9c++學(xué)習(xí)7(清華大學(xué)第五版)派生類(lèi)的生成過(guò)程經(jīng)歷了三個(gè)步驟:

●吸收基類(lèi)成員●改造基類(lèi)成員●添加派生類(lèi)新成員2.派生類(lèi)的生成過(guò)程

10c++學(xué)習(xí)7(清華大學(xué)第五版)(1)吸收基類(lèi)成員●在C++的繼承機(jī)制中,派生類(lèi)吸收基類(lèi)中除構(gòu)造函數(shù)和析構(gòu)函數(shù)之外的全部成員?!裎栈?lèi)成員是一個(gè)重用的過(guò)程,體現(xiàn)了代碼的重用11c++學(xué)習(xí)7(清華大學(xué)第五版)(2)改造基類(lèi)成員

●由于基類(lèi)的部分成員在派生類(lèi)中可能不需要卻也被繼承下來(lái),對(duì)這些沒(méi)有實(shí)際需要而被繼承的成員,在派生類(lèi)中需要對(duì)其進(jìn)行改造?!窀脑旎?lèi)成員包括兩個(gè)方面:(1)通過(guò)派生的三種繼承方式來(lái)控制;(2)通過(guò)在派生類(lèi)中定義同名成員(包括成員函數(shù)和數(shù)據(jù)成員)來(lái)屏蔽在派生類(lèi)中不起作用的部分基類(lèi)成員。12c++學(xué)習(xí)7(清華大學(xué)第五版)(3)添加新成員●添加派生類(lèi)的新成員是繼承機(jī)制的核心內(nèi)容?!駜H僅繼承基類(lèi)的成員是不夠的,需要在派生類(lèi)中添加新成員,以保證派生類(lèi)自身特殊屬性和行為的實(shí)現(xiàn)。

13c++學(xué)習(xí)7(清華大學(xué)第五版)6.3訪問(wèn)權(quán)限控制根據(jù)派生類(lèi)的定義格式可知,有三種繼承方式。

publicprotectedprivate14c++學(xué)習(xí)7(清華大學(xué)第五版)派生類(lèi)成員的訪問(wèn)屬性由一個(gè)類(lèi)生成的對(duì)象,它只能訪問(wèn)類(lèi)的公有成員,不能訪問(wèn)其它成員:而一個(gè)類(lèi)的成員函數(shù)可以訪問(wèn)類(lèi)中所有成員!15c++學(xué)習(xí)7(清華大學(xué)第五版)

當(dāng)類(lèi)的繼承方式為public(公有)繼承屬性時(shí),在派生類(lèi)中,基類(lèi)的公有成員和保護(hù)成員被繼承后其訪問(wèn)屬性沒(méi)有變化,即分別作為派生類(lèi)的公有成員和保護(hù)成員,派生類(lèi)的成員可以直接訪問(wèn)它們。但是,在公有繼承時(shí)派生類(lèi)的成員無(wú)法訪問(wèn)基類(lèi)的私有成員。1.公有繼承

16c++學(xué)習(xí)7(清華大學(xué)第五版)公有繼承公有繼承時(shí),派生類(lèi)的對(duì)象只可訪問(wèn)基類(lèi)中的公有成員,不能訪問(wèn)其它成員。派生類(lèi)的成員函數(shù)可以訪問(wèn)基類(lèi)中的公有成員和保護(hù)成員,不可訪問(wèn)其私有成員。特別提示17c++學(xué)習(xí)7(清華大學(xué)第五版)公有繼承18c++學(xué)習(xí)7(清華大學(xué)第五版)classstudent{private:intage;protected:charsex;public:intGetage();};classgraduatestudent:publicstudent{private:intstunum;public:intGetnum();};公有繼承特點(diǎn):基類(lèi)的公有成員和保護(hù)成員作為派生類(lèi)的成員時(shí),都保持原有狀態(tài),而私有成員仍是私有。19c++學(xué)習(xí)7(清華大學(xué)第五版)voidgraduatestudent::Getnum()//派生類(lèi)成員函數(shù)定義{//cout<<"age:"<<age<<endl;//不可訪問(wèn)基類(lèi)的私有成員

cout<<"stunum:"<<stunum<<endl;//派生類(lèi)的私有成員

cout<<"age:"<<Getage()<<endl;//基類(lèi)的公有成員

cout<<"sex:"<<sex<<endl;//即:student::sex

基類(lèi)的保護(hù)成員

}即:student::Getage()公有繼承20c++學(xué)習(xí)7(清華大學(xué)第五版)voidmain(){graduatestudentzh;//生成派生類(lèi)對(duì)象

zh.Getage();//即:student::Getage();基類(lèi)中的公有成員

zh.Getnum();//訪問(wèn)派生類(lèi)中的公有成員

//cout<<zh.sex;//即:student::sex,error私有成員

//

cout<<zh.stunum;//error私有成員

//

cout<<zh.age;//即:student::age,error保護(hù)成員}公有繼承21c++學(xué)習(xí)7(清華大學(xué)第五版)●在派生類(lèi)中,基類(lèi)的公有成員和保護(hù)成員作為派生類(lèi)的私有成員,派生類(lèi)的成員可以直接訪問(wèn)它們,而派生類(lèi)的成員無(wú)法訪問(wèn)基類(lèi)的私有成員;●在派生類(lèi)的外部,派生類(lèi)的成員和派生類(lèi)的對(duì)象均無(wú)法訪問(wèn)基類(lèi)的全部成員;●私有繼承之后,全部基類(lèi)成員在派生類(lèi)中都成為了私有成員或不可訪問(wèn)的成員,無(wú)法進(jìn)一步派生;●私有繼承方式一般很少使用。

2.私有繼承22c++學(xué)習(xí)7(清華大學(xué)第五版)私有繼承時(shí),基類(lèi)的成員只能由直接派生類(lèi)訪問(wèn),而無(wú)法再往下繼承。特別提示私有繼承23c++學(xué)習(xí)7(清華大學(xué)第五版)2。私有繼承24c++學(xué)習(xí)7(清華大學(xué)第五版)特點(diǎn):基類(lèi)的公有成員和保護(hù)成員都作為派生類(lèi)的私有成員,并且不能被這個(gè)派生類(lèi)的子類(lèi)所訪問(wèn)。2私有繼承classstudent{private:intage;protected:charsex;public:intGetage();};classgraduatestudent:privatestudent{private:intstunum;public:intGetnum();};25c++學(xué)習(xí)7(清華大學(xué)第五版)voidgraduatestudent::Getnum()//派生類(lèi)成員函數(shù)定義{//cout<<"age:"<<age<<endl;//不可訪問(wèn)基類(lèi)的私有成員

cout<<"stunum:"<<stunum<<endl;//派生類(lèi)的私有成員

cout<<"age:"<<Getage()<<endl;//基類(lèi)的公有成員

cout<<"sex:"<<sex<<endl;//即:student::sex

基類(lèi)的保護(hù)成員

}2私有繼承26c++學(xué)習(xí)7(清華大學(xué)第五版)voidmain(){graduatestudentzh;//生成派生類(lèi)對(duì)象

//zh.Getage();//即:student::Getage();不能訪問(wèn)

zh.Getnum();//訪問(wèn)派生類(lèi)中的公有成員

//cout<<zh.sex;//即:student::sex,error私有成員

//cout<<zh.stunum;//error私有成員

//cout<<zh.age;//即:student::age,error}2私有繼承27c++學(xué)習(xí)7(清華大學(xué)第五版)3.保護(hù)繼承●當(dāng)類(lèi)的繼承方式為protected繼承屬性時(shí),在派生類(lèi)中,基類(lèi)的公有成員和保護(hù)成員均作為派生類(lèi)的保護(hù)成員,派生類(lèi)的成員可以直接訪問(wèn)它們,而派生類(lèi)的成員無(wú)法訪問(wèn)基類(lèi)的私有成員?!裨谂缮?lèi)的外部,派生類(lèi)的成員和派生類(lèi)的對(duì)象均無(wú)法訪問(wèn)基類(lèi)的全部成員?!袢绻?lèi)只進(jìn)行了一次派生,則保護(hù)繼承和私有繼承的功能完全相同,但保護(hù)繼承可以進(jìn)一步派生,而私有繼承則不可以,兩者具有實(shí)質(zhì)性差別。

28c++學(xué)習(xí)7(清華大學(xué)第五版)29c++學(xué)習(xí)7(清華大學(xué)第五版)

基類(lèi)的所有公有成員和保護(hù)成員都作為派生類(lèi)的保護(hù)成員,并且只能被它的派生類(lèi)成員函數(shù)訪問(wèn),基類(lèi)的私有成員仍是私有的。保護(hù)繼承classstudent{private:intage;protected:charsex;public:intGetage();};classgraduatestudent:protectedstudent{private:intstunum;public:intGetnum();};30c++學(xué)習(xí)7(清華大學(xué)第五版)voidgraduatestudent::Getnum()//派生類(lèi)成員函數(shù)定義{//cout<<"age:"<<age<<endl;//不可訪問(wèn)基類(lèi)的私有成員

cout<<"stunum:"<<stunum<<endl;//派生類(lèi)的私有成員

cout<<"age:"<<Getage()<<endl;//基類(lèi)的公有成員

cout<<"sex:"<<sex<<endl;//即:student::sex

基類(lèi)的保護(hù)成員

}§1.3保護(hù)繼承31c++學(xué)習(xí)7(清華大學(xué)第五版)voidmain(){graduatestudentzh;//生成派生類(lèi)對(duì)象

//zh.Getage();//即:student::Getage();不能訪問(wèn)

zh.Getnum();//訪問(wèn)派生類(lèi)中的公開(kāi)成員

//cout<<zh.sex;//即:student::sex,error私有成員

//cout<<zh.stunum;//error私有成員

//cout<<zh.age;//即:student::age,error}§1.3保護(hù)繼承32c++學(xué)習(xí)7(清華大學(xué)第五版)三種繼承方式的屬性表

公有成員

私有成員

保護(hù)成員公有繼承公有不可訪問(wèn)保護(hù)私有繼承私有不可訪問(wèn)私有保護(hù)繼承保護(hù)不可訪問(wèn)保護(hù)33c++學(xué)習(xí)7(清華大學(xué)第五版)●基類(lèi)的構(gòu)造函數(shù)的功能是創(chuàng)建基類(lèi)對(duì)象并進(jìn)行初始化,而析構(gòu)函數(shù)的功能在基類(lèi)對(duì)象生存期結(jié)束時(shí)對(duì)基類(lèi)對(duì)象進(jìn)行必要的清理工作?!裨谂缮?lèi)的生成過(guò)程中,派生類(lèi)將產(chǎn)生新的成員,對(duì)新增數(shù)據(jù)成員的初始化需要由派生類(lèi)自身的構(gòu)造函數(shù)完成,而對(duì)派生類(lèi)對(duì)象的清理工作需要由相應(yīng)的析構(gòu)函數(shù)完成。7.4派生類(lèi)的構(gòu)造函數(shù)和析構(gòu)函數(shù)34c++學(xué)習(xí)7(清華大學(xué)第五版)●派生類(lèi)的數(shù)據(jù)成員既包括基類(lèi)的數(shù)據(jù)成員,也包括派生類(lèi)新增數(shù)據(jù)成員?!衽缮?lèi)構(gòu)造函數(shù)在對(duì)派生類(lèi)對(duì)象進(jìn)行初始化時(shí)需要對(duì)基類(lèi)數(shù)據(jù)成員、新增數(shù)據(jù)成員和內(nèi)嵌對(duì)象成員進(jìn)行初始化。

●在定義派生類(lèi)的構(gòu)造函數(shù)時(shí)除了對(duì)自己的數(shù)據(jù)成員進(jìn)行初始化外,還必須調(diào)用基類(lèi)的構(gòu)造函數(shù)初始化基類(lèi)的數(shù)據(jù)成員1.派生類(lèi)的構(gòu)造函數(shù)35c++學(xué)習(xí)7(清華大學(xué)第五版)派生類(lèi)構(gòu)造函數(shù)的格式:派生類(lèi)名::派生類(lèi)名(總參數(shù)表):基類(lèi)名(參數(shù)表1),對(duì)象成員名(參數(shù)表2){

派生類(lèi)新增成員的初始化;}36c++學(xué)習(xí)7(清華大學(xué)第五版)派生類(lèi)構(gòu)造函數(shù)的調(diào)用順序如下:基類(lèi)的構(gòu)造函數(shù)對(duì)象成員類(lèi)的構(gòu)造函數(shù)(若有)派生類(lèi)構(gòu)造函數(shù)注意:1、若基類(lèi)中未定義帶參數(shù)構(gòu)造函數(shù),則派生類(lèi)構(gòu)造函數(shù)的定義中可以省略對(duì)基類(lèi)構(gòu)造函數(shù)的調(diào)用。2、若基類(lèi)的構(gòu)造函數(shù)使用了參數(shù),則派生類(lèi)必須定義構(gòu)造函數(shù),為基類(lèi)構(gòu)造函數(shù)提供參數(shù)。37c++學(xué)習(xí)7(清華大學(xué)第五版)#include<iostream.h>classBase{public:Base(){cout<<"BaseConstructor"<<endl;}};classDeriveA:publicBase{public:DeriveA(){cout<<"DeriveAConstructor"<<endl;}};classDeriveB:publicDeriveA{public:DeriveB(){cout<<"DeriveBConstructor"<<endl;}};voidmain(){DeriveBB;}38c++學(xué)習(xí)7(清華大學(xué)第五版)#include<iostream.h>classBase{private: intn; doublea;public: Base(intx1,doublex2) { n=x1;a=x2;cout<<"CallADestructor"<<endl; cout<<"n="<<n<<endl;cout<<"a="<<a<<endl; } ~Base(){}};39c++學(xué)習(xí)7(清華大學(xué)第五版)classDerive:publicBase{private: intm; doubleb;public: Derive(intx1=10,doublex2=20,inty1=218,doubley2=288.8):Base(x1,x2),m(y1),b(y2) { cout<<"CallBDestructor"<<endl;cout<<"m="<<m<<endl;cout<<"b="<<b<<endl; } ~Derive(){}};voidmain(){ Deriveobj1;}40c++學(xué)習(xí)7(清華大學(xué)第五版)classdata{intx;public:data(intx){data::x=x; cout<<"classdata\n";}};classA{datad1;

public:

A(intx):d1(x){cout<<"classA\n";}};運(yùn)行結(jié)果:classdataclassAclassdataclassBclassCclassB:publicA{datad2;

public:

B(intx):A(x),d2(x){cout<<"classB\n";}};classC:publicB{

public:

C(intx):B(x){cout<<"classC\n";}};voidmain(){Cobject(5);}

派生類(lèi)的構(gòu)造函數(shù)41c++學(xué)習(xí)7(清華大學(xué)第五版)析構(gòu)函數(shù)也不能被繼承,因此在執(zhí)行派生類(lèi)的析構(gòu)函數(shù)時(shí),基類(lèi)的析構(gòu)函數(shù)也將被調(diào)用。析構(gòu)函數(shù)調(diào)用的順序與構(gòu)造函數(shù)相反.2派生類(lèi)的析構(gòu)函數(shù)classM{public:M(){m1=m2=0;}M(inti,intj){m1=i;m2=j;}voidprint(){cout<<m1<<","<<m2<<",";}~M(){cout<<"M’sdestructorcalled.\n";}private:intm1,m2;};42c++學(xué)習(xí)7(清華大學(xué)第五版)classN:publicM{public:N(){n=0;}N(inti,intj,intk);voidprint()

溫馨提示

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