數(shù)據(jù)結(jié)構(gòu)福大2012級課件繼承_第1頁
數(shù)據(jù)結(jié)構(gòu)福大2012級課件繼承_第2頁
數(shù)據(jù)結(jié)構(gòu)福大2012級課件繼承_第3頁
數(shù)據(jù)結(jié)構(gòu)福大2012級課件繼承_第4頁
數(shù)據(jù)結(jié)構(gòu)福大2012級課件繼承_第5頁
已閱讀5頁,還剩71頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

設(shè)

計(jì)2023/12/111引

言2023/12/112概

顧基于過程的程序設(shè)計(jì)基于對象的程序設(shè)計(jì)面向?qū)ο蟮某绦蛟O(shè)計(jì)程序的主體:函數(shù)類的生成、設(shè)計(jì)類對象的使用C++過程化語言基礎(chǔ)程序的主體:類2023/12/113結(jié)

論僅僅支持基于類的設(shè)計(jì)、生成和類對象的使用是不能稱為面向?qū)ο蟮某绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)的四大主要特點(diǎn)抽象封裝繼承多態(tài)基于對象的程序設(shè)計(jì)面向?qū)ο蟮某绦蛟O(shè)計(jì)2023/12/114

要010203繼承與派生(重點(diǎn))多態(tài)性與虛函數(shù)(重點(diǎn))函數(shù)模板(常用)04類模板(常用)2023/12/115繼

生2023/12/116問

入福州大學(xué)有三類學(xué)生:本科生、碩士生、博士生是否設(shè)計(jì)成一個類student?本科生、碩士生、博士生的數(shù)據(jù)成員不盡相同是否設(shè)計(jì)三個獨(dú)立的類:bachelor、master、doctor?合理嗎?2023/12/1172023/12/118classbachelor{private:intID;Stringname;intage;Datedayofbirth;floatscore[40];public:bachelor(…);~bachelor();voidprint();voidget_name();……};classmaster{private:intID;Stringname;intage;Datedayofbirth;Stringadvisor;floatscore[15];public:master(…);~master(){};voidprint();voidget_name();……};classdoctor{private:intID;String*name;intage;Datedayofbirth;Stringadvisors[5];floatscore[10];public:doctor(…);~doctor(){};voidprint();voidget_name();……};問

析共同的數(shù)據(jù)屬性在3個類中各自描述一次,顯得繁瑣,重復(fù),能夠簡化為統(tǒng)一描述?分析姓名、學(xué)號、年齡等數(shù)據(jù)屬性是所有學(xué)生都有的共性,本科生、碩士生和博士生是學(xué)生的細(xì)化和特化(P.118)先統(tǒng)一描述所有學(xué)生的共性數(shù)據(jù)以及對共性數(shù)據(jù)的處理功能;描述某一類學(xué)生時,首先說明它是學(xué)生的一種,然后再逐一描述這種學(xué)生的個性——面向?qū)ο蟪绦蛟O(shè)計(jì)中類的繼承與派生2023/12/1192023/12/1110classbachelor

:publicstudent{private:floatscore[40];public:bachelor(…);~bachelor();voidprint();……};classmaster

:publicstudent{private:Stringadvisor;floatscore[15];public:master(…);~master(){};voidprint();……};classdoctor

:publicstudent{private:Stringadvisors[3];floatscore[10];public:doctor(…);~doctor(){};voidprint();……};classstudent{private:public:intID;student(…);String*name;~student();intage;voidget_name();Datedayofbirth;voidget_age();……};繼

生類

承派生類可以獲得基類的已有特性派生類繼承了基類的所有數(shù)據(jù)成員和成員函數(shù)類的繼承是層次結(jié)構(gòu)的基類是派生類的抽象類的派生基類產(chǎn)生了一個和具有基類各種特性的新的子類派生類可以對成員作必要的增加和調(diào)整派生類又可以作為基類再派生出新的派生類派生類是基類的具體化繼承派生在一個已經(jīng)存在的類(基類/父類)的基礎(chǔ)之上建立一個新的類(派生類/子類)2023/12/1111單

承單一繼承(P.119)一個派生類只能由一個基類派生而來一個子類只有一個父類圖b的情況中對于類Y1和類Y2而言仍然是單一繼承方式的派生類多重繼承(P.119)一個派生類由多個(>=2)基類派生而成一個子類有兩個或者兩個以上的父類注意區(qū)分圖C和圖d的多級繼承和多重繼承2023/12/1112繼

式classA{inti;//基類成員};classB:publicA//A派生了B//B繼承了A,B自動擁有A的成員{intj;//定義派生類的新成員};2023/12/1113派

明一般形式(P.118)class<派生類標(biāo)識符>:<派生方式><基類標(biāo)識符>{<派生類新定義成員>};2023/12/1114派

實(shí)

例基類(普通學(xué)生類)classstudent{private:intID;char*name;floatscore[11];public:student(intn1,char*nm1){……}~student(){deletename;}voidprint(){…..}voidget_name(){……}……};派生類聲明(大學(xué)生類)classundergstudent

:publicstudent{private:char*major;//新增加的數(shù)據(jù)成員floatscore[40];public:……voidget_data{……}print_major(){……}//新增加的成員函數(shù)voidprint(){……}}2023/12/1115基類(普通學(xué)生類)派生類聲明(大學(xué)生類)大學(xué)生類(未考慮訪問屬性)

intID;char*name;

floatscore[40];

char*major;

print_major(){……}

voidprint(){…..}…….2023/12/1116派

構(gòu)

成兩大部分從基類繼承來的成員聲明派生類時增加的部分每一部分都分別包括數(shù)據(jù)成員和成員函數(shù)構(gòu)成方式并非基類的成員和派生類增加成員的簡單加和接收基類的全部成員(不包括構(gòu)造函數(shù)和析構(gòu)函數(shù))調(diào)整從基類接收的成員(指定派生方式改變訪問屬性)聲明派生類時增加的成員根據(jù)需要增加成員定義派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)(不能從基類繼承而來)2023/12/1117基

調(diào)

整無條件地全部接收不接收析構(gòu)函數(shù)和構(gòu)造函數(shù)接收到的基類成員可以調(diào)整通過指定派生方式改變成員的訪問屬性可以聲明同名成員加以覆蓋2023/12/1118派

式三種派生方式publicprivateprotected不同的派生方式?jīng)Q定了基類成員在派生類中訪問屬性2023/12/1119派

性分情況處理基類的成員函數(shù)訪問基類成員

?派生類成員函數(shù)訪問派生類自己增加的成員

?基類的成員函數(shù)訪問派生類的成員

?派生類外訪問派生類的成員根據(jù)成員的訪問屬性判定能否由類外訪問該成員派生類的成員函數(shù)訪問基類的成員派生類外訪問基類的成員核心問題:如何確定基類成員在派生類中的訪問屬性基類成員聲明的訪問屬性派生類對基類的繼承方式2023/12/1120三

權(quán)

繼承

方式基類成員公有繼承私有繼承保護(hù)繼承公有成員公有私有保護(hù)私有成員派生類成員不可訪問派生類成員不可訪問派生類成員不可訪問保護(hù)成員保護(hù)私有保護(hù)2023/12/1121公

承基類的私有成員并沒有成為派生類的私有成員基類的私有成員僅僅只有基類的成員函數(shù)才能應(yīng)用基類的私有成員是派生類的不可訪問的成員基類的私有成員只能通過基類的公有成員函數(shù)加以訪問實(shí)例:基類student派生類undergstudent(公有繼承)假設(shè)一創(chuàng)建一個對象freshman是一個大一新生(Bob,10009,CS,……)如何能夠正確獲取name、ID、major等信息?2023/12/1122方

一主函數(shù)調(diào)用freshman的公有成員函數(shù)get_data派生類中g(shù)et_data如下定義:cout<<name;cout<<ID;cout<<major;原因:name和ID是基類的私有成員,在派生類中不可訪問2023/12/1123方

二基類中公有成員函數(shù)get_namecout<<name;基類中公有成員函數(shù)get_IDcout<<ID;派生類中公有成員函數(shù)get_majorcout<<major;主函數(shù)中分別調(diào)用freshman的get_name、get_ID和get_major完成信息的獲取公有繼承下,基類的公有成員在派生類中仍為公有,可在派生類外訪問2023/12/1124方

三主函數(shù)調(diào)用freshman的公有成員函數(shù)get_data派生類中g(shù)et_data如下定義:get_name();//調(diào)用基類的成員函數(shù)get_ID();//調(diào)用基類的成員函數(shù)cout<<major;基類中公有成員函數(shù)get_name定義如下:cout<<name;基類中公有成員函數(shù)get_ID定義如下:cout<<ID;2023/12/1125公

點(diǎn)

伸特點(diǎn):較好地保留了基類的特征幾乎具有基類的全部功能公有繼承方式下的公有派生類是基類的子類型基類和公有派生類之間的類型轉(zhuǎn)換回顧:不同數(shù)據(jù)類型之間在一定條件下可以進(jìn)行類型的轉(zhuǎn)換——賦值兼容example:整型數(shù)據(jù)可以復(fù)制給雙精度型的變量基類對象和子類(公有派生類)之間也有賦值兼容關(guān)系2023/12/1126基

轉(zhuǎn)

換派生類對象向基類對象賦值賦值時舍棄派生類自己的成員賦值后基類對象的成員并未擴(kuò)充//set_major是undergstudent的公有成員函數(shù)undergstudentugS1(Bob,10009,CS,….);studentS1;S1=ugS1;//?S1.set_major(“EE”);//?ugS1.set_major(“EE”);//?不能用基類對象對子類對象賦值同一基類的不同子類對象之間不能賦值2023/12/1127派生類對象可以向基類對象的引用進(jìn)行賦值或者初始化回顧:變量x的引用是變量x的別名,和變量x共享同一存儲空間studentS1;undergstudentugS1(Bob,10009,CS,….);student&S1_ref=S1;S1_ref=ugS1;//?,用子類對象ugS1對S1_ref進(jìn)行賦值student&S2_ref=ugS1;/*?,定義了一個student對象的引用S2_ref,并用ugS1進(jìn)行初始化*/S1_ref.set_major(“EE”);//?S1_ref和S2_ref仍然只是基類對象的引用,并不是ugS1(子類對象)的別名,S1_ref、S2_ref和ugS1只共享了ugS1中屬于基類部分的存儲空間2023/12/1128如果函數(shù)的參數(shù)是基類對象或者基類對象的引用,相應(yīng)的實(shí)參可以用子類對象參數(shù)傳遞時完成自動類型轉(zhuǎn)換派生類對象的地址可以賦給指向基類對象的指針變量指向基類對象的指針變量也可以指向派生類對象指向基類對象的指針變量只能訪問派生類中的基類成員,而不能訪問派生類增加的成員studentS1;undergstudentugS1(Bob,10009,CS,….);student*S_ptr=&S1;S_ptr=&ugS1;/*?,子類對象ugS1的地址可以賦值給指向基類對象的指針變量*/S_ptr->set_major(“EE”);//*?不能訪問派生類增加的成員2023/12/1129私

承私有基類的公有成員和保護(hù)成員相當(dāng)于派生類中的私有成員派生類的成員可以訪問私有基類的公有成員和保護(hù)成員,但是派生類外不能訪問實(shí)例:情況與前述相同,唯一的區(qū)別是派生類undergstudent以私有繼承的方式由student類派生而成2023/12/1130方

一主函數(shù)調(diào)用freshman的公有成員函數(shù)get_data派生類中g(shù)et_data如下定義:cout<<name;cout<<ID;cout<<major;原因:name和ID是基類的私有成員,公有繼承下在派生類中已不可訪問,私有繼承下依然不可行2023/12/1131方

二基類中公有成員函數(shù)get_namecout<<name;基類中公有成員函數(shù)get_IDcout<<ID;派生類中公有成員函數(shù)get_majorcout<<major;主函數(shù)中分別調(diào)用freshman的get_name、get_ID和get_major完成信息的獲取原因:私有繼承下,基類的公有成員等同于派生類的私有成員,無法在派生類外訪問2023/12/1132方

三主函數(shù)調(diào)用freshman的公有成員函數(shù)get_data派生類中g(shù)et_data如下定義:get_name;//調(diào)用基類的成員函數(shù)get_ID;//調(diào)用基類的成員函數(shù)cout<<major;基類中公有成員函數(shù)get_name定義如下:cout<<name;基類中公有成員函數(shù)get_ID定義如下:cout<<ID;2023/12/1133保

護(hù)

承保護(hù)成員受保護(hù)的成員不能為類外訪問,但是可以被派生類的成員函數(shù)所引用基類(普通學(xué)生類)classstudent{private:intID;char*name;floatscore[11];public:……};派生類聲明(大學(xué)生類)classundergstudent

:publicstudent{private:char*major;//新增加的數(shù)據(jù)成員floatscore[40];public:……}classstudent{protected:intID;char*name;floatscore[11];public:……};2023/12/11342023/12/1135保

護(hù)

承保護(hù)基類的公有成員和保護(hù)成員相當(dāng)于派生類中的保護(hù)成員派生類的成員可以訪問保護(hù)基類的公有成員和保護(hù)成員,但是派生類外不能訪問實(shí)例:情況與前述相同,但是派生類undergstudent以保護(hù)繼承的方式由student類派生而成2023/12/1136第

形(ID和name為私有數(shù)據(jù))基類(普通學(xué)生類)classstudent{private:intID;char*name;floatscore[11];public:student(intn1,char*nm1){……}~student(){deletename;}voidprint(){…..}voidget_name(){……}……};派生類聲明(大學(xué)生類)classundergstudent

:protectedstudent{private:char*major;//新增加的數(shù)據(jù)成員floatscore[40];public:……voidget_data{……}print_major(){……}//新增加的成員函數(shù)voidprint(){……}}2023/12/1137方

一主函數(shù)調(diào)用freshman的公有成員函數(shù)get_data派生類中g(shù)et_data如下定義:cout<<name;cout<<ID;cout<<major;原因:name和ID是基類的私有成員,保護(hù)繼承下在派生類中依然不可訪問2023/12/1138方

二基類中公有成員函數(shù)get_namecout<<name;基類中公有成員函數(shù)get_IDcout<<ID;派生類中公有成員函數(shù)get_majorcout<<major;主函數(shù)中分別調(diào)用freshman的get_name、get_ID和get_major完成信息的獲取原因:保護(hù)繼承下,基類的公有成員等同于派生類的保護(hù)成員,無法在派生類外訪問2023/12/1139方

三主函數(shù)調(diào)用freshman的公有成員函數(shù)get_data派生類中g(shù)et_data如下定義:get_name;//調(diào)用基類的成員函數(shù)get_ID;//調(diào)用基類的成員函數(shù)cout<<major;基類中公有成員函數(shù)get_name定義如下:cout<<name;基類中公有成員函數(shù)get_ID定義如下:cout<<ID;2023/12/1140第二種情形

(ID和name為保護(hù)成員數(shù)據(jù))基類(普通學(xué)生類)classstudent{protected:

intID;char*name;private:floatscore[11];public:student(intn1,char*nm1){……}~student(){deletename;}voidprint(){…..}voidget_name(){……}……};派生類聲明(大學(xué)生類)classundergstudent

:protectedstudent{private:char*major;//新增加的數(shù)據(jù)成員floatscore[40];public:……voidget_data{……}print_major(){……}//新增加的成員函數(shù)voidprint(){……}}2023/12/1141方

一主函數(shù)調(diào)用freshman的公有成員函數(shù)get_data派生類中g(shù)et_data如下定義:cout<<name;cout<<ID;cout<<major;原因:name和ID是基類的保護(hù)成員,公有繼承下和保護(hù)繼承下派生類中可以訪問2023/12/1142方

二基類中公有成員函數(shù)get_namecout<<name;基類中公有成員函數(shù)get_IDcout<<ID;派生類中公有成員函數(shù)get_majorcout<<major;主函數(shù)中分別調(diào)用freshman的get_name、get_ID和get_major完成信息的獲取原因:保護(hù)繼承下,基類的公有成員等同于派生類的保護(hù)成員,無法在派生類外訪問2023/12/1143方

三主函數(shù)調(diào)用freshman的公有成員函數(shù)get_data派生類中g(shù)et_data如下定義:get_name;//調(diào)用基類的成員函數(shù)get_ID;//調(diào)用基類的成員函數(shù)cout<<major;基類中公有成員函數(shù)get_name定義如下:cout<<name;基類中公有成員函數(shù)get_ID定義如下:cout<<ID;2023/12/1144保

護(hù)

護(hù)

用在類的層次繼承結(jié)構(gòu)中找到數(shù)據(jù)共享與成員隱蔽之間的最佳均衡如果需要在派生類中引用基類的某些成員,應(yīng)當(dāng)將基類中的這些成員聲明為protected,而非private2023/12/1145以student類中的ID和name為例如果聲明成為private,將造成派生類無法訪問的局面,使得派生類的使用很不方便如果聲明成為public,使得基類的數(shù)據(jù)隱蔽性受到一定的損傷如果聲明成為protected,派生類可以訪問從而使得基類和派生類之間可以實(shí)現(xiàn)數(shù)據(jù)共享,基類和派生類的外部都不能訪問,保障了數(shù)據(jù)的隱蔽性2023/12/1146多

性類的層次繼承結(jié)構(gòu)導(dǎo)致了類的多級派生基類基類的派生類派生類的派生類……直接派生類vs.間接派生類直接基類vs.間接基類多級派生情況下各成員的訪問屬性在基類和其直接派生類之間按照一級派生訪問屬性的原則確定各成員的訪問屬性后逐級向下遷移2023/12/1147組合類的構(gòu)造函數(shù)(子對象)組合類:類的數(shù)據(jù)成員本身就是一個對象實(shí)例classPerson{Stringname;//name是由類String創(chuàng)建的對象,可稱為子對象intage;public:Person(…);~Person(){};…}2023/12/1148Person的構(gòu)造函數(shù)該如何處理其子對象數(shù)據(jù)成員name的初始化?參

數(shù)

表在構(gòu)造函數(shù)頭之后,函數(shù)體之前,由冒號開頭,逗號分隔,每一部分形式為:數(shù)據(jù)成員名(初始值)Person(constString&nm=“”,inta=18)

:name(nm),age(a)//參數(shù)初始表

{}//即使函數(shù)體為空,該處大括號也不能省略適用情形子對象所屬類沒有缺省構(gòu)造函數(shù),必須采用參數(shù)初始化表子對象的構(gòu)造函數(shù)復(fù)雜,用參數(shù)初始化表可提高效率常量型數(shù)據(jù)成員或引用型數(shù)據(jù)成員,必須在參數(shù)初始化表中賦初值2023/12/1149派

構(gòu)

數(shù)回顧:構(gòu)造函數(shù)的作用對類中的數(shù)據(jù)成員進(jìn)行初始化派生類的構(gòu)造函數(shù)的特殊性派生類的數(shù)據(jù)成員構(gòu)成較為特殊從基類中接收來的數(shù)據(jù)成員派生類自己增加的數(shù)據(jù)成員派生類并沒有繼承基類的構(gòu)造函數(shù)派生類的構(gòu)造函數(shù)的初始化工作基類數(shù)據(jù)成員的初始化工作

派生類增加的數(shù)據(jù)成員的初始化工作2023/12/1150派

實(shí)

例基類(普通學(xué)生類)classstudent{private:intID;char*name;floatscore[11];public:student(intn1,char*nm1){……}~student(){deletename;}voidprint(){…..}voidget_name(){……}……};派生類聲明(大學(xué)生類)classundergstudent

:publicstudent{private:char*major;//新增加的數(shù)據(jù)成員floatscore[40];public:……voidget_data{……}print_major(){……}//新增加的成員函數(shù)voidprint(){……}}2023/12/1151實(shí)

例:大學(xué)生類undergstudent的構(gòu)造函數(shù)方案一undergstudent(intn,stringstu_name,stringstu_major,float*scoreList){ID=n;name=stu_name;major=stu_major;score=scoreList;}派生類無法訪問基類的私有成員數(shù)據(jù)方案二undergstudent(intn,stringstu_name,stringstu_major,float*scoreList){student(n,stu_name);//調(diào)用基類構(gòu)造函數(shù)major=stu_major;score=scoreList;}不能在派生類構(gòu)造函數(shù)體中顯式調(diào)用構(gòu)造函數(shù)!雖然能通過編譯,但結(jié)果不對2023/12/1152派

構(gòu)

數(shù)

道方案三undergstudent(intn,stringstu_name,stringstu_major,float*scoreList):student(n,stu_name);//調(diào)用基類構(gòu)造函數(shù){/*派生類的函數(shù)體中只對派生類新增的數(shù)據(jù)成員進(jìn)行初始化*/major=stu_major;score=scoreList;}解決的辦法是通過成員初始化表來完成基類數(shù)據(jù)成員的初始化,在參數(shù)初始化表中可以顯式調(diào)用基類構(gòu)造函數(shù)派生類的函數(shù)體完成新增數(shù)據(jù)成員的初始化2023/12/1153派

構(gòu)

數(shù)

式<派生類名>(<總參數(shù)表>):<基類構(gòu)造函數(shù)名>(<參數(shù)表1>){<派生類數(shù)據(jù)成員的初始化>};說明:1、如果派生類構(gòu)造函數(shù)在類的外面定義,類體中只需要寫這個函數(shù)的聲明:<派生類名>(<總參數(shù)表>);2、總參數(shù)表中的參數(shù)包括了基類構(gòu)造函數(shù)所需的參數(shù)和派生類新增數(shù)據(jù)成員初始化所需的參數(shù)

生成一個類對象(10009,bob,CS,……)

undergstudent(n,stu_name,stu_major,scorelist):student(n,stu_name)構(gòu)造函數(shù)的參數(shù)初始化表2023/12/1154有

構(gòu)

數(shù)子對象類的數(shù)據(jù)成員本身就是一個類對象classundergstudent

:publicstudent{private:char*major;floatscore[40];

Teacher*tutor;//子對象public:……}classteacher

{private:intID;char*name;

char*title;public:……}2023/12/1155分析:對象建立時需要對它的數(shù)據(jù)成員進(jìn)行初始化派生類構(gòu)造函數(shù)對其數(shù)據(jù)成員進(jìn)行初始化的時候也需要對其中的子對象進(jìn)行初始化在成員初始化表中顯式調(diào)用子對象的構(gòu)造函數(shù)undergstudent(intn,stringstu_name,stringstu_major,float*scoreList,intT_n,stringT_name,stringT_title):student(n,stu_name),tutor(T_n,T_name,T_title)2023/12/1156派

構(gòu)

數(shù)

式<派生類名>(<總參數(shù)表>):<基類名>(<參數(shù)表1>),<對象成員名>(<參數(shù)表2>){<派生類其它數(shù)據(jù)成員的初始化>};派生類構(gòu)造函數(shù)的任務(wù)初始化基類數(shù)據(jù)成員初始化子對象數(shù)據(jù)成員初始化其它派生類數(shù)據(jù)成員派生類構(gòu)造函數(shù)執(zhí)行順序調(diào)用基類構(gòu)造函數(shù)調(diào)用子對象構(gòu)造函數(shù)執(zhí)行派生類構(gòu)造函數(shù)體2023/12/1157特

構(gòu)

數(shù)多層派生時,不需要在成員初始化表中列出其上每一層派生類的構(gòu)造函數(shù),只需要列出其直接基類的構(gòu)造函數(shù)即可派生類新增成員無需任何初始化時,派生類構(gòu)造函數(shù)的函數(shù)體為空如果基類沒有定義構(gòu)造函數(shù),或者定義了沒有參數(shù)的構(gòu)造函數(shù),派生類定義構(gòu)造函數(shù)可以不寫基類構(gòu)造函數(shù),派生類構(gòu)造函數(shù)調(diào)用時,系統(tǒng)會自動首先調(diào)用基類的默認(rèn)構(gòu)造函數(shù)2023/12/1158派

構(gòu)

數(shù)回顧:析構(gòu)函數(shù)的作用在對象撤銷之前,進(jìn)行必要的清理工作派生類的析構(gòu)函數(shù)對派生類新增加的成員進(jìn)行清理根據(jù)需要定義相應(yīng)的析構(gòu)函數(shù)如果有子對象,還需要對子對象進(jìn)行清理調(diào)用子對象的析構(gòu)函數(shù)完成需要對接收自基類的成員進(jìn)行清理調(diào)用基類的析構(gòu)函數(shù)完成自動調(diào)用基類和子對象的析構(gòu)函數(shù)2023/12/1159派生類析構(gòu)函數(shù)的任務(wù)清理基類數(shù)據(jù)成員清理子對象數(shù)據(jù)成員清理其它派生類數(shù)據(jù)成員派生類析構(gòu)函數(shù)執(zhí)行順序調(diào)用基類析構(gòu)函數(shù)調(diào)用子對象析構(gòu)函數(shù)執(zhí)行派生類析構(gòu)函數(shù)部分2023/12/1160派

蓋覆蓋規(guī)則基類的同名成員在派生類中被屏蔽,成為不可見的定義在派生類對象模塊中通過對象名訪問同名的成員,訪問的是派生類的成員實(shí)例:studentstudent_A;undergstudentstudent_B;student_A.print();//調(diào)用基類中的成員函數(shù)printstudent_B.print();//調(diào)用派生類中的成員函數(shù)printstudent_B.student::print();//指明作用域而調(diào)用基類成員數(shù)據(jù)成員的覆蓋只要命名相同即可成員函數(shù)的覆蓋不僅函數(shù)名要相同,函數(shù)的參數(shù)表包括參數(shù)個數(shù)和類型都要相同2023/12/1161多

承一個類可以從一個或者多個基類派生而來。根據(jù)派生類繼承基類的個數(shù),將繼承分為單繼承和多繼承。當(dāng)派生類有多個基類時稱為多繼承。單繼承可以看作是多繼承的一個特例,多繼承可以看作是多個單繼承的組合,它們有很多相同特性。實(shí)例教師類在職研究生類研究生類2023/12/1162多

義class<派生類名>:<繼承方式><基類名1>,…,<繼承方式><基類名n>{<派生類新定義成員>};2023/12/1163多

構(gòu)

數(shù)成員初始化表中需要包含多個基類構(gòu)造函數(shù)一般形式<派生類名>(<總參數(shù)表>):<基類名1>(<參數(shù)表1>),…,<基類名n>(<參數(shù)表n>){<派生類數(shù)據(jù)成員的初始化>};2023/12/1164多

題情形一:兩個基類有同名成員2023/12/1165classgstudent:

{protected:intID;char*name;char*major;public:init();……}classteacher

{protected:intID;char*name;

char*title;public:init();……}classonjobgstudent:publicgstudent,publicteacher

{public:voidprint();{cout<<ID<<endl;cout<<name<<endl;}……}main()

{onjobgstudentTeach_A;

Teach_A.init();//該調(diào)用哪個init()?

Teach_A.print();//print函數(shù)該輸出哪個ID…?//研究生學(xué)號和教師工號并不同}二義性2023/12/1166解

一用作用域運(yùn)算符“::”進(jìn)行限定,顯式訪問基類成員。main()

{onjobgstudentTeach_A;

Teach_A.Teacher::init();Teach_A.gstudent::init();

Teach_A.print();}classonjobgstudent:publicgstudent,publicteacher

{public:voidprint();{cout<<Teacher::ID<<endl;cout<<Teacher::name<<endl;cout<<gstudent::ID<<endl;cout<<major<<endl;}……}派生類的成員函數(shù)訪問基類成員,不必寫對象名2023/12/1167情

二:兩個基類和派生類都有同名成員classgstudent:

{protected:intID;char*name;char*major;public:voidinit(…);……}classteacher

{protected:intID;char*name;

char*title;public:voidinit(…);……}classonjobgstudent:publicgstudent,publicteacher

{public:voidinit(…);{

}voidprint();……}main()

{onjobgstudentTeach_A;

Teach_A.init(…);//調(diào)用哪個init?

//根據(jù)同名覆蓋原則//調(diào)用onjobgstudent的init

Teach_A.print();}無二義性2023/12/1168內(nèi)在問題分析Teacher_A.init調(diào)用類onjobgstudent的init函數(shù)進(jìn)行初始化,而類onjobgstudent的init函數(shù)分別調(diào)用了gstudent的init函數(shù)和teacher

溫馨提示

  • 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

提交評論