第8章+類(lèi)的繼承與多態(tài)性_第1頁(yè)
第8章+類(lèi)的繼承與多態(tài)性_第2頁(yè)
第8章+類(lèi)的繼承與多態(tài)性_第3頁(yè)
第8章+類(lèi)的繼承與多態(tài)性_第4頁(yè)
第8章+類(lèi)的繼承與多態(tài)性_第5頁(yè)
已閱讀5頁(yè),還剩113頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、高級(jí)語(yǔ)言程序設(shè)計(jì)高級(jí)語(yǔ)言程序設(shè)計(jì)C+張海威張海威南開(kāi)大學(xué)計(jì)算機(jī)與控制工程學(xué)院南開(kāi)大學(xué)計(jì)算機(jī)與控制工程學(xué)院http:/第第8 8章章 類(lèi)的繼承與多態(tài)性類(lèi)的繼承與多態(tài)性類(lèi)的繼承與派生類(lèi)的繼承與派生1派生類(lèi)派生類(lèi)2虛基類(lèi)虛基類(lèi)3類(lèi)的多態(tài)性與虛函數(shù)類(lèi)的多態(tài)性與虛函數(shù)42Database & Information System Lab綜合示例綜合示例5http:/第第8 8章章 類(lèi)的繼承與多態(tài)性類(lèi)的繼承與多態(tài)性類(lèi)的繼承與派生類(lèi)的繼承與派生1派生類(lèi)派生類(lèi)2虛基類(lèi)虛基類(lèi)3類(lèi)的多態(tài)性與虛函數(shù)類(lèi)的多態(tài)性與虛函數(shù)43Database & Information System Lab綜合示例綜合示

2、例5http:/類(lèi)的繼承與派生類(lèi)的繼承與派生vC+C+程序用不同的類(lèi)定義來(lái)表示一組數(shù)據(jù)以程序用不同的類(lèi)定義來(lái)表示一組數(shù)據(jù)以及對(duì)這些數(shù)據(jù)的操作與處理,而類(lèi)之間往及對(duì)這些數(shù)據(jù)的操作與處理,而類(lèi)之間往往具有某種關(guān)系,往具有某種關(guān)系,“繼承與派生繼承與派生”就是類(lèi)就是類(lèi)間的一種常用關(guān)系。間的一種常用關(guān)系。 例如,交通工具例如,交通工具汽車(chē)汽車(chē)轎車(chē)轎車(chē)紅旗轎車(chē)紅旗轎車(chē)具有層次關(guān)系!具有層次關(guān)系! 汽車(chē)汽車(chē) 是一種特殊的是一種特殊的 交通工具交通工具 轎車(chē)轎車(chē)是一種特殊的是一種特殊的 汽車(chē)汽車(chē) 紅旗轎車(chē)紅旗轎車(chē)是一種特殊的是一種特殊的 轎車(chē)轎車(chē)Database & Information Syst

3、em Lab4http:/類(lèi)的繼承與派生類(lèi)的繼承與派生v繼承繼承(inheritance)(inheritance)與派生與派生 該機(jī)制是面向?qū)ο蟪绦蛟O(shè)計(jì)使代碼可以復(fù)用的該機(jī)制是面向?qū)ο蟪绦蛟O(shè)計(jì)使代碼可以復(fù)用的最重要的手段最重要的手段 它允許程序員在保持原有類(lèi)特性的基礎(chǔ)上進(jìn)行它允許程序員在保持原有類(lèi)特性的基礎(chǔ)上進(jìn)行擴(kuò)展,增加功能擴(kuò)展,增加功能 繼承產(chǎn)生新的類(lèi),稱(chēng)為繼承產(chǎn)生新的類(lèi),稱(chēng)為派生類(lèi)派生類(lèi) 派生類(lèi)可以訪(fǎng)問(wèn)基類(lèi)的保護(hù)成員(在基類(lèi)中以關(guān)鍵派生類(lèi)可以訪(fǎng)問(wèn)基類(lèi)的保護(hù)成員(在基類(lèi)中以關(guān)鍵字字protected標(biāo)識(shí)的成員)標(biāo)識(shí)的成員) 繼承呈現(xiàn)了面向?qū)ο蟪绦蛟O(shè)計(jì)的層次結(jié)構(gòu),體繼承呈現(xiàn)了面向?qū)ο蟪绦蛟O(shè)

4、計(jì)的層次結(jié)構(gòu),體現(xiàn)了由簡(jiǎn)單到復(fù)雜的認(rèn)識(shí)過(guò)程現(xiàn)了由簡(jiǎn)單到復(fù)雜的認(rèn)識(shí)過(guò)程Database & Information System Lab5http:/類(lèi)的繼承與派生類(lèi)的繼承與派生v層次概念層次概念是計(jì)算機(jī)的重要概念。通過(guò)是計(jì)算機(jī)的重要概念。通過(guò)繼承繼承(inheritanceinheritance)的機(jī)制可對(duì)類(lèi)()的機(jī)制可對(duì)類(lèi)(classclass)分層,提供類(lèi)型分層,提供類(lèi)型/ /子類(lèi)型的關(guān)系。子類(lèi)型的關(guān)系。vC+C+通過(guò)通過(guò)類(lèi)派生類(lèi)派生(class derivationclass derivation)的機(jī))的機(jī)制來(lái)支持繼承。被繼承的類(lèi)稱(chēng)為制來(lái)支持繼承。被繼承的類(lèi)稱(chēng)為基類(lèi)基類(lèi)(bas

5、e classbase class)或)或超類(lèi)超類(lèi)(superclasssuperclass),),新的類(lèi)為新的類(lèi)為派生類(lèi)派生類(lèi)(derived classderived class)或)或子類(lèi)子類(lèi)(subclasssubclass)。基類(lèi)和派生類(lèi)的集合稱(chēng)作)?;?lèi)和派生類(lèi)的集合稱(chēng)作類(lèi)繼承層次結(jié)構(gòu)類(lèi)繼承層次結(jié)構(gòu)(hierarchyhierarchy)Database & Information System Lab6http:/類(lèi)的繼承與派生類(lèi)的繼承與派生v如果基類(lèi)和派生類(lèi)共享相同的公有接口,如果基類(lèi)和派生類(lèi)共享相同的公有接口,則派生類(lèi)被稱(chēng)作基類(lèi)的則派生類(lèi)被稱(chēng)作基類(lèi)的子類(lèi)型子類(lèi)型(su

6、btypesubtype)v派生反映了事物之間的聯(lián)系,事物的派生反映了事物之間的聯(lián)系,事物的共性共性與個(gè)性與個(gè)性之間的關(guān)系之間的關(guān)系v派生與獨(dú)立設(shè)計(jì)若干相關(guān)的類(lèi),前者工作派生與獨(dú)立設(shè)計(jì)若干相關(guān)的類(lèi),前者工作量少,重復(fù)的部分可以從基類(lèi)繼承來(lái),不量少,重復(fù)的部分可以從基類(lèi)繼承來(lái),不需要單獨(dú)編程。需要單獨(dú)編程。 Database & Information System Lab7http:/類(lèi)的繼承與派生類(lèi)的繼承與派生v【例如例如】公司四種雇員檔案的管理:公司四種雇員檔案的管理: employeeemployee(雇員)雇員) 姓名、年齡、工資;姓名、年齡、工資; managermanage

7、r(經(jīng)理)經(jīng)理) 姓名、年齡、工資、姓名、年齡、工資、行政級(jí)別行政級(jí)別; engineerengineer(工程師)工程師) 姓名、年齡、工資、姓名、年齡、工資、專(zhuān)業(yè)、學(xué)位專(zhuān)業(yè)、學(xué)位; directordirector(高級(jí)主管)高級(jí)主管) 姓名、年齡、工資、姓名、年齡、工資、行政級(jí)別、職務(wù)行政級(jí)別、職務(wù)。Database & Information System Lab8http:/類(lèi)的繼承與派生類(lèi)的繼承與派生v【例例8.18.1】假設(shè)公司雇員分為:雇員假設(shè)公司雇員分為:雇員( (employee)employee)、經(jīng)理經(jīng)理( (manager)manager)、工程師工程師( (

8、engineer)engineer)、高級(jí)主管高級(jí)主管( (director)director)。且假定且假定只關(guān)心這幾類(lèi)雇員各自的如下一些數(shù)據(jù):只關(guān)心這幾類(lèi)雇員各自的如下一些數(shù)據(jù): employee(employee(雇員雇員) )類(lèi):姓名、年齡、工資;類(lèi):姓名、年齡、工資; manager(manager(經(jīng)理經(jīng)理) )類(lèi):姓名、年齡、工資、行政級(jí)別;類(lèi):姓名、年齡、工資、行政級(jí)別; engineer(engineer(工程師工程師) )類(lèi)姓名、年齡、工資、專(zhuān)業(yè)、學(xué)位;類(lèi)姓名、年齡、工資、專(zhuān)業(yè)、學(xué)位; director(director(高級(jí)主管高級(jí)主管) )類(lèi):姓名、年齡、工資、行政級(jí)類(lèi)

9、:姓名、年齡、工資、行政級(jí)別、職務(wù)。別、職務(wù)。Database & Information System Lab9http:/類(lèi)的繼承與派生類(lèi)的繼承與派生#include #include using namespace std;class employee/employee類(lèi)將作為其它幾個(gè)類(lèi)的基類(lèi)類(lèi)將作為其它幾個(gè)類(lèi)的基類(lèi) short age; float salary; protected: char * name;public: employee(short ag,float sa,char * na) age=ag;salary=sa;name=new charstrlen(na

10、)+1;strcpy(name,na);Database & Information System Lab10http:/類(lèi)的繼承與派生類(lèi)的繼承與派生void print ()cout name: ;coutage : ;coutsalaryendl; employee() deletename; ; Database & Information System Lab11http:/類(lèi)的繼承與派生類(lèi)的繼承與派生class manager:public employee /派生類(lèi)派生類(lèi)int level;public:manager(short ag, float sa, cha

11、r* na, int lev):employee (ag,sa,na) /對(duì)基類(lèi)初始化負(fù)責(zé)對(duì)基類(lèi)初始化負(fù)責(zé)level=lev; void print() employee:print();/調(diào)用基類(lèi)調(diào)用基類(lèi)print顯示顯示“共性共性”數(shù)據(jù)數(shù)據(jù)cout level:levelendl; ;Database & Information System Lab12http:/類(lèi)的繼承與派生類(lèi)的繼承與派生/*注意:允許派生類(lèi)中的注意:允許派生類(lèi)中的print與基類(lèi)的與基類(lèi)的print重名,按重名,按如下規(guī)定進(jìn)行處理:對(duì)子類(lèi)而言,不加類(lèi)名限定時(shí)默認(rèn)如下規(guī)定進(jìn)行處理:對(duì)子類(lèi)而言,不加類(lèi)名限定時(shí)默認(rèn)

12、為是處理子類(lèi)成員,而要訪(fǎng)問(wèn)父類(lèi)重名成員時(shí),則要通為是處理子類(lèi)成員,而要訪(fǎng)問(wèn)父類(lèi)重名成員時(shí),則要通過(guò)類(lèi)名限定過(guò)類(lèi)名限定*/class engineer:public employee char speciality,adegree; public: .;enum ptitle PS,GM,VPS,VGM;class director:public manager ptitle post; public: .;Database & Information System Lab13http:/類(lèi)的繼承與派生類(lèi)的繼承與派生void main() /主函數(shù)主函數(shù)employee emp1(23,

13、610.5,zhang), emp2(27,824.75,zhao);manager man1(32,812.45,li,11), man2(34,1200.5,cui,7);engineer eng(26,1420.10,meng,E,M);director dir(38,1800.2,zhou,2,GM);emp1.print();emp2.print();man1.print();man2.employee:print(); /調(diào)用基類(lèi)的調(diào)用基類(lèi)的print eng.print();dir.print();Database & Information System Lab14ht

14、tp:/類(lèi)的繼承與派生類(lèi)的繼承與派生程序執(zhí)行后的顯示結(jié)果如下:程序執(zhí)行后的顯示結(jié)果如下:zhang: 23 : 610.5zhao: 27 : 824.75li: 32 : 812.45level:11cui: 34 : 1200.5meng: 26 : 1420.1speciality:Eacademic degree:Mzhou: 38 : 1800.2level:2post:1Database & Information System Lab15http:/類(lèi)的繼承與派生類(lèi)的繼承與派生v單繼承單繼承 派生類(lèi)只有一個(gè)直接基類(lèi)的情況稱(chēng)為單繼承派生類(lèi)只有一個(gè)直接基類(lèi)的情況稱(chēng)為單繼承(s

15、ingle-inheritancesingle-inheritance)。)。Database & Information System Lab16基類(lèi)基類(lèi)派生類(lèi)派生類(lèi)1 1派生類(lèi)派生類(lèi)2 2一個(gè)基類(lèi)可以一個(gè)基類(lèi)可以直接派生出多直接派生出多個(gè)派生類(lèi)個(gè)派生類(lèi) http:/類(lèi)的繼承與派生類(lèi)的繼承與派生v多重繼承多重繼承 如果一個(gè)派生類(lèi)可以同時(shí)有多個(gè)基類(lèi),稱(chēng)為多如果一個(gè)派生類(lèi)可以同時(shí)有多個(gè)基類(lèi),稱(chēng)為多重繼承(重繼承(multiple-inheritancemultiple-inheritance),這時(shí)的派),這時(shí)的派生類(lèi)同時(shí)得到了多個(gè)已有類(lèi)的特征。生類(lèi)同時(shí)得到了多個(gè)已有類(lèi)的特征。Datab

16、ase & Information System Lab17基類(lèi)基類(lèi)1 1基類(lèi)基類(lèi)2 2基類(lèi)基類(lèi)n n派生類(lèi)派生類(lèi)1 1派生類(lèi)派生類(lèi)2 2派生類(lèi)可以由派生類(lèi)可以由多個(gè)基類(lèi)共同多個(gè)基類(lèi)共同派生出來(lái),派生出來(lái),稱(chēng)稱(chēng)為為多重多重繼承繼承。http:/類(lèi)的繼承與派生類(lèi)的繼承與派生v多層次繼承多層次繼承 在派生過(guò)程中,派生出來(lái)的新類(lèi)同樣可以作為在派生過(guò)程中,派生出來(lái)的新類(lèi)同樣可以作為基類(lèi)再繼續(xù)派生出更新的類(lèi),依此類(lèi)推形成一基類(lèi)再繼續(xù)派生出更新的類(lèi),依此類(lèi)推形成一個(gè)層次結(jié)構(gòu)。直接參與派生出某類(lèi)稱(chēng)為直接基個(gè)層次結(jié)構(gòu)。直接參與派生出某類(lèi)稱(chēng)為直接基類(lèi),而基類(lèi)的基類(lèi),以及更深層的基類(lèi)稱(chēng)為類(lèi),而基類(lèi)的基類(lèi),

17、以及更深層的基類(lèi)稱(chēng)為間間接基類(lèi)接基類(lèi)。v類(lèi)族類(lèi)族 同時(shí)一個(gè)基類(lèi)可以直接派生出多個(gè)派生類(lèi)。這同時(shí)一個(gè)基類(lèi)可以直接派生出多個(gè)派生類(lèi)。這樣形成了一個(gè)相互關(guān)聯(lián)的樣形成了一個(gè)相互關(guān)聯(lián)的類(lèi)族類(lèi)族。如。如MFCMFC就是這就是這樣的族類(lèi),它由一個(gè)樣的族類(lèi),它由一個(gè)CObjectCObject類(lèi)派生出類(lèi)派生出200200個(gè)個(gè)MFCMFC類(lèi)中的絕大多數(shù)。類(lèi)中的絕大多數(shù)。Database & Information System Lab18http:/類(lèi)的繼承與派生類(lèi)的繼承與派生v派生編程的步驟派生編程的步驟Database & Information System Lab19編制編制派生派生類(lèi)時(shí)

18、類(lèi)時(shí)可分可分四步四步 吸收基類(lèi)的成員吸收基類(lèi)的成員 改造基類(lèi)成員改造基類(lèi)成員 發(fā)展新成員發(fā)展新成員 重寫(xiě)構(gòu)造函數(shù)與析構(gòu)函數(shù)重寫(xiě)構(gòu)造函數(shù)與析構(gòu)函數(shù) 不論是數(shù)據(jù)成員,還是函數(shù)不論是數(shù)據(jù)成員,還是函數(shù)成員成員(非私有成員),(非私有成員),除構(gòu)造函數(shù)與析除構(gòu)造函數(shù)與析構(gòu)函數(shù)外全盤(pán)接收構(gòu)函數(shù)外全盤(pán)接收 聲明一個(gè)和某基類(lèi)成員同名的新聲明一個(gè)和某基類(lèi)成員同名的新成員成員, ,派生類(lèi)中的新成員就屏蔽了派生類(lèi)中的新成員就屏蔽了基類(lèi)同名成員稱(chēng)為同名覆蓋基類(lèi)同名成員稱(chēng)為同名覆蓋(overrideoverride) 派生類(lèi)新成員必須與基類(lèi)成員派生類(lèi)新成員必須與基類(lèi)成員不同名,它的加入保證派生類(lèi)不同名,它的加入保證派

19、生類(lèi)在功能上有所發(fā)展。在功能上有所發(fā)展。 http:/類(lèi)的繼承與派生類(lèi)的繼承與派生v派生編程的步驟派生編程的步驟 第二步中,第二步中,新成員如是成員函數(shù),參數(shù)表也必新成員如是成員函數(shù),參數(shù)表也必須一樣須一樣,否則是重載。,否則是重載。 第三步中,獨(dú)有的新成員才是繼承與派生的核第三步中,獨(dú)有的新成員才是繼承與派生的核心特征。心特征。 第四步是重寫(xiě)構(gòu)造函數(shù)與析構(gòu)函數(shù),派生類(lèi)不第四步是重寫(xiě)構(gòu)造函數(shù)與析構(gòu)函數(shù),派生類(lèi)不繼承這兩種函數(shù)。不管原來(lái)的函數(shù)是否可用繼承這兩種函數(shù)。不管原來(lái)的函數(shù)是否可用一一律重寫(xiě)律重寫(xiě)可免出錯(cuò)。可免出錯(cuò)。Database & Information System Lab

20、20http:/第第8 8章章 類(lèi)的繼承與多態(tài)性類(lèi)的繼承與多態(tài)性類(lèi)的繼承與派生類(lèi)的繼承與派生1派生類(lèi)派生類(lèi)2虛基類(lèi)虛基類(lèi)3類(lèi)的多態(tài)性與虛函數(shù)類(lèi)的多態(tài)性與虛函數(shù)421Database & Information System Lab綜合示例綜合示例5http:/派生類(lèi)派生類(lèi)派生類(lèi)派生類(lèi)派生類(lèi)的訪(fǎng)問(wèn)權(quán)限派生類(lèi)的訪(fǎng)問(wèn)權(quán)限派生類(lèi)的定義派生類(lèi)的定義友元與友元與靜態(tài)成員的繼承靜態(tài)成員的繼承二義性問(wèn)題二義性問(wèn)題派生類(lèi)對(duì)象的派生類(lèi)對(duì)象的說(shuō)明與初始化說(shuō)明與初始化賦值兼容性問(wèn)題賦值兼容性問(wèn)題22Database & Information System Labhttp:/派生類(lèi)的定義派生類(lèi)的定義c

21、lass : private: ;public: ;protected: ; 的一般格式為:的一般格式為: ,. , 又可為又可為private、 public或或protected Database & Information System Lab23http:/派生類(lèi)的訪(fǎng)問(wèn)權(quán)限派生類(lèi)的訪(fǎng)問(wèn)權(quán)限派生方式派生方式( (基類(lèi)基類(lèi) 在基類(lèi)中的在基類(lèi)中的 在派生類(lèi)中在派生類(lèi)中 的被繼承方式的被繼承方式) ) 存取權(quán)限存取權(quán)限 的存取權(quán)限的存取權(quán)限=publicpublicpublicpublicpublicpublicpublicpublicpotectedpotected protecte

22、dprotectedpublicpublicprivateprivate(inaccessible)(inaccessible)potected potected publicpublicprotectedprotectedpotectedpotectedpotectedpotected protectedprotectedpotectedpotectedprivateprivate(inaccessible)(inaccessible)privateprivatepublicpublicprivateprivateprivateprivatepotectedpotected privatep

23、rivateprivateprivateprivateprivate(inaccessible)(inaccessible) =Database & Information System Lab24http:/派生類(lèi)的訪(fǎng)問(wèn)權(quán)限派生類(lèi)的訪(fǎng)問(wèn)權(quán)限vpublicpublic派生方式派生方式 使基類(lèi)的公有成員和保護(hù)成員在派生類(lèi)中仍然使基類(lèi)的公有成員和保護(hù)成員在派生類(lèi)中仍然是公有成員和保護(hù)成員,而基類(lèi)的私有成員不是公有成員和保護(hù)成員,而基類(lèi)的私有成員不可在派生類(lèi)中被存取。可在派生類(lèi)中被存取。vprotectedprotected派生方式派生方式 使基類(lèi)的公有成員和保護(hù)成員在派生類(lèi)中都變使基類(lèi)的公

24、有成員和保護(hù)成員在派生類(lèi)中都變?yōu)楸Wo(hù)成員,而基類(lèi)的私有成員不可在派生類(lèi)為保護(hù)成員,而基類(lèi)的私有成員不可在派生類(lèi)中被存取。中被存取。vprivateprivate派生方式派生方式 使基類(lèi)的公有成員和保護(hù)成員在派生類(lèi)中都變使基類(lèi)的公有成員和保護(hù)成員在派生類(lèi)中都變?yōu)樗接谐蓡T,而基類(lèi)的私有成員不可在派生類(lèi)為私有成員,而基類(lèi)的私有成員不可在派生類(lèi)中被存取。中被存取。Database & Information System Lab25http:/派生類(lèi)的訪(fǎng)問(wèn)權(quán)限派生類(lèi)的訪(fǎng)問(wèn)權(quán)限v派生類(lèi)的成員可根據(jù)訪(fǎng)問(wèn)權(quán)限分為四類(lèi)派生類(lèi)的成員可根據(jù)訪(fǎng)問(wèn)權(quán)限分為四類(lèi) 不可訪(fǎng)問(wèn)的成員不可訪(fǎng)問(wèn)的成員 基類(lèi)的基類(lèi)的pri

25、vateprivate私有成員被繼承過(guò)來(lái)后,這些成員私有成員被繼承過(guò)來(lái)后,這些成員在派生類(lèi)中是不可訪(fǎng)問(wèn)的。在派生類(lèi)中是不可訪(fǎng)問(wèn)的。 私有成員私有成員 包括在派生類(lèi)中新增加的包括在派生類(lèi)中新增加的privateprivate私有成員以及從私有成員以及從基類(lèi)私有繼承過(guò)來(lái)的某些成員。這些成員在派生類(lèi)基類(lèi)私有繼承過(guò)來(lái)的某些成員。這些成員在派生類(lèi)中是可以訪(fǎng)問(wèn)的。中是可以訪(fǎng)問(wèn)的。Database & Information System Lab26http:/派生類(lèi)的訪(fǎng)問(wèn)權(quán)限派生類(lèi)的訪(fǎng)問(wèn)權(quán)限v派生類(lèi)的成員可根據(jù)訪(fǎng)問(wèn)權(quán)限分為四類(lèi)派生類(lèi)的成員可根據(jù)訪(fǎng)問(wèn)權(quán)限分為四類(lèi) 保護(hù)成員保護(hù)成員 包括在派生類(lèi)中新增

26、加的包括在派生類(lèi)中新增加的protectedprotected保護(hù)成員以及保護(hù)成員以及從基類(lèi)繼承過(guò)來(lái)的某些成員。這些成員在派生類(lèi)中從基類(lèi)繼承過(guò)來(lái)的某些成員。這些成員在派生類(lèi)中是可以訪(fǎng)問(wèn)的。是可以訪(fǎng)問(wèn)的。 公有成員公有成員 包括在派生類(lèi)中新增加的包括在派生類(lèi)中新增加的publicpublic公有成員以及從基公有成員以及從基類(lèi)公有繼承過(guò)來(lái)的基類(lèi)的類(lèi)公有繼承過(guò)來(lái)的基類(lèi)的publicpublic成員。這些成員不成員。這些成員不僅在派生類(lèi)中可以訪(fǎng)問(wèn),而且在建立派生類(lèi)對(duì)象的僅在派生類(lèi)中可以訪(fǎng)問(wèn),而且在建立派生類(lèi)對(duì)象的模塊中,也可以通過(guò)對(duì)象來(lái)訪(fǎng)問(wèn)它們模塊中,也可以通過(guò)對(duì)象來(lái)訪(fǎng)問(wèn)它們Database &

27、; Information System Lab27http:/派生類(lèi)的訪(fǎng)問(wèn)權(quán)限派生類(lèi)的訪(fǎng)問(wèn)權(quán)限v【例例8.28.2】讀程序,分析運(yùn)行結(jié)果讀程序,分析運(yùn)行結(jié)果class baseCla int privData; protected: int protData; public: int publData; ;class publDrvCla : public baseCla public:void usebaseClaData() publData=11; /OK!protData=12; /OK!privData=13; /ERROR! ;Database & Information

28、 System Lab28http:/派生類(lèi)的訪(fǎng)問(wèn)權(quán)限派生類(lèi)的訪(fǎng)問(wèn)權(quán)限class claD21 : public publDrvCla public:void usebaseClaData() publData=111; /OK!protData=121; /OK!privData=131; /ERROR! ;class protDrvCla : protected baseCla public:void usebaseClaData() publData=21; /OK!protData=22; /OK!privData=23; /ERROR! ;Database & Informa

29、tion System Lab29http:/派生類(lèi)的訪(fǎng)問(wèn)權(quán)限派生類(lèi)的訪(fǎng)問(wèn)權(quán)限class claD22 : public protDrvCla public:void usebaseClaData() publData=211; /OK!protData=221; /OK!privData=231; /ERROR! ;class claD22 : public protDrvCla public:void usebaseClaData() publData=211; /OK!protData=221; /OK!privData=231; /ERROR! ;Database & Info

30、rmation System Lab30http:/派生類(lèi)的訪(fǎng)問(wèn)權(quán)限派生類(lèi)的訪(fǎng)問(wèn)權(quán)限class privDrvCla : private baseCla public:void usebaseClaData() publData=31; /OK!protData=32; /OK! privData=33; /ERROR! ;class claD23 : public privDrvCla public:void usebaseClaData() publData=311; /ERROR!protData=321; /ERROR!privData=331; /ERROR! ;Database &

31、amp; Information System Lab31http:/派生類(lèi)的訪(fǎng)問(wèn)權(quán)限派生類(lèi)的訪(fǎng)問(wèn)權(quán)限void main() baseCla ob0;ob0.publData=1; /OK! tData=2; /ERROR!ob0.privData=3; /ERROR!claD21 d21;claD22 d22;claD23 d23;d21.publData=4; /OK!tData=5; /ERROR! d21.privData=6; /ERROR! d22.publData=7; /ERROR! tData=8; /ERROR!d22.privDa

32、ta=9; /ERROR! d23.publData=7; /ERROR!tData=8; /ERROR! d23.privData=9; /ERROR!Database & Information System Lab32http:/派生類(lèi)對(duì)象的說(shuō)明派生類(lèi)對(duì)象的說(shuō)明v派生類(lèi)對(duì)象的說(shuō)明與所有類(lèi)對(duì)象的說(shuō)明方派生類(lèi)對(duì)象的說(shuō)明與所有類(lèi)對(duì)象的說(shuō)明方式相同式相同 ,nv類(lèi)對(duì)象進(jìn)行說(shuō)明的同時(shí),需要進(jìn)行初始化類(lèi)對(duì)象進(jìn)行說(shuō)明的同時(shí),需要進(jìn)行初始化 初始化列表初始化列表 派生類(lèi)的構(gòu)造函數(shù)派生類(lèi)的構(gòu)造函數(shù)Database & Information System Lab33http:

33、/派生類(lèi)的構(gòu)造函數(shù)派生類(lèi)的構(gòu)造函數(shù)v派生類(lèi)的構(gòu)造函數(shù)的一般格式如下:派生類(lèi)的構(gòu)造函數(shù)的一般格式如下:(): 按如下格式構(gòu)成:按如下格式構(gòu)成: ()1), . . , ()n), ()1), . . , ()m)若若無(wú)對(duì)象成員無(wú)對(duì)象成員時(shí),則不出現(xiàn)此后半部分;基類(lèi)名與時(shí),則不出現(xiàn)此后半部分;基類(lèi)名與對(duì)象成員名的次序無(wú)關(guān)緊要,各自出現(xiàn)的順序可以對(duì)象成員名的次序無(wú)關(guān)緊要,各自出現(xiàn)的順序可以任意任意Database & Information System Lab34http:/派生類(lèi)的構(gòu)造函數(shù)派生類(lèi)的構(gòu)造函數(shù)v派生類(lèi)構(gòu)造函數(shù)執(zhí)行的一般次序如下:派生類(lèi)構(gòu)造函數(shù)執(zhí)行的一般次序如下: 調(diào)用各基類(lèi)的

34、構(gòu)造函數(shù),調(diào)用順序?yàn)榕缮^承調(diào)用各基類(lèi)的構(gòu)造函數(shù),調(diào)用順序?yàn)榕缮^承時(shí)的時(shí)的基類(lèi)聲明順序基類(lèi)聲明順序。 若派生類(lèi)含有對(duì)象成員的話(huà),調(diào)用各對(duì)象成員若派生類(lèi)含有對(duì)象成員的話(huà),調(diào)用各對(duì)象成員的構(gòu)造函數(shù),調(diào)用順序按照派生類(lèi)中的構(gòu)造函數(shù),調(diào)用順序按照派生類(lèi)中對(duì)象成員對(duì)象成員的聲明順序的聲明順序。 執(zhí)行派生類(lèi)構(gòu)造函數(shù)的函數(shù)體。執(zhí)行派生類(lèi)構(gòu)造函數(shù)的函數(shù)體。Database & Information System Lab35http:/派生類(lèi)的構(gòu)造函數(shù)派生類(lèi)的構(gòu)造函數(shù)v派生類(lèi)構(gòu)造函數(shù)與基類(lèi)構(gòu)造函數(shù)的聯(lián)系派生類(lèi)構(gòu)造函數(shù)與基類(lèi)構(gòu)造函數(shù)的聯(lián)系 在派生類(lèi)構(gòu)造函數(shù)中,只要基類(lèi)不是使用無(wú)參在派生類(lèi)構(gòu)造函數(shù)中,只

35、要基類(lèi)不是使用無(wú)參的默認(rèn)構(gòu)造函數(shù)都要顯式給出基類(lèi)名和參數(shù)表。的默認(rèn)構(gòu)造函數(shù)都要顯式給出基類(lèi)名和參數(shù)表。 如果如果基類(lèi)沒(méi)有定義構(gòu)造函數(shù),則派生類(lèi)也可以基類(lèi)沒(méi)有定義構(gòu)造函數(shù),則派生類(lèi)也可以不定義,全部采用系統(tǒng)給定的默認(rèn)構(gòu)造函數(shù)。不定義,全部采用系統(tǒng)給定的默認(rèn)構(gòu)造函數(shù)。 如果基類(lèi)定義了帶有形參表的構(gòu)造函數(shù)時(shí),派如果基類(lèi)定義了帶有形參表的構(gòu)造函數(shù)時(shí),派生類(lèi)就應(yīng)當(dāng)定義構(gòu)造函數(shù)。生類(lèi)就應(yīng)當(dāng)定義構(gòu)造函數(shù)。Database & Information System Lab36http:/派生類(lèi)的析構(gòu)函數(shù)派生類(lèi)的析構(gòu)函數(shù)v析構(gòu)函數(shù)析構(gòu)函數(shù)的功能是作善后工作。的功能是作善后工作。 只要在函數(shù)體內(nèi)把派生類(lèi)新

36、增的一般成員處理只要在函數(shù)體內(nèi)把派生類(lèi)新增的一般成員處理好就可以了好就可以了,而對(duì)新增的成員對(duì)象和基類(lèi)的善,而對(duì)新增的成員對(duì)象和基類(lèi)的善后工作,系統(tǒng)會(huì)自己調(diào)用成員對(duì)象和基類(lèi)的析后工作,系統(tǒng)會(huì)自己調(diào)用成員對(duì)象和基類(lèi)的析構(gòu)函數(shù)來(lái)完成。構(gòu)函數(shù)來(lái)完成。v析構(gòu)函數(shù)各部分執(zhí)行次序與構(gòu)造函數(shù)相反析構(gòu)函數(shù)各部分執(zhí)行次序與構(gòu)造函數(shù)相反 首先對(duì)派生類(lèi)新增一般成員析構(gòu),然后對(duì)新增首先對(duì)派生類(lèi)新增一般成員析構(gòu),然后對(duì)新增對(duì)象成員析構(gòu),最后對(duì)基類(lèi)成員析構(gòu)對(duì)象成員析構(gòu),最后對(duì)基類(lèi)成員析構(gòu)Database & Information System Lab37http:/派生類(lèi)的說(shuō)明與初始化派生類(lèi)的說(shuō)明與初始化v【例

37、例8.38.3】讀程序,分析運(yùn)行結(jié)果讀程序,分析運(yùn)行結(jié)果#includeusing namespace std;class CBint b;public:CB(int n)b=n; coutCB:b=bendl; ;CB()coutCBobj is destructingendl; class CC int c;public:CC(int n1,int n2) c=n1; coutCC:c=cendl; ;CC()coutCCobj is destructingendl;Database & Information System Lab38http:/派生類(lèi)的說(shuō)明與初始化派生類(lèi)的說(shuō)明與

38、初始化class CD:public CB,public CC int d;public: CD(int n1,int n2,int n3,int n4) :CC(n3,n4),CB(n2)/先先CB,后后CC d=n1; coutCD:d=dendl; CD()coutCDobj is destructingendl; ;void main(void) CD CDobj(2,4,6,8);Database & Information System Lab39http:/派生類(lèi)的說(shuō)明與初始化派生類(lèi)的說(shuō)明與初始化運(yùn)行結(jié)果為:運(yùn)行結(jié)果為:CB:b=4CC:c=6CD:d=2CDobj is

39、 destructingCCobj is destructingCBobj is destrcting 【思考思考】將派生類(lèi)將派生類(lèi)CDCD改寫(xiě)為如下形式后,請(qǐng)給出輸改寫(xiě)為如下形式后,請(qǐng)給出輸出結(jié)果。出結(jié)果。 Database & Information System Lab40http:/派生類(lèi)的說(shuō)明與初始化派生類(lèi)的說(shuō)明與初始化class CD:public CB,public CC int d; CC obcc; CB obcb;public: CD(int n1,int n2,int n3,int n4) :CC(n3,n4), CB(n2), obcb(100+n2), obc

40、c(100+n3,100+n4) d=n1; coutCD:d=dendl; ; CD()coutCDobj is destructingendl;Database & Information System Lab41/先基類(lèi)先基類(lèi)CB、CC,再對(duì)象成員,再對(duì)象成員CC、CB,最后派生類(lèi),最后派生類(lèi)CDhttp:/派生類(lèi)的說(shuō)明與初始化派生類(lèi)的說(shuō)明與初始化輸出結(jié)果:輸出結(jié)果:CB:b=4CC:c=6CC:c=106CB:b=104CD:d=2CDobj is destructingCBobj is destructingCCobj is destructingCCobj is destr

41、uctingCBobj is destructingDatabase & Information System Lab42http:/友元的繼承友元的繼承v基類(lèi)的友元不繼承基類(lèi)的友元不繼承 如果基類(lèi)有友元類(lèi)或友元函數(shù),則其派生類(lèi)不如果基類(lèi)有友元類(lèi)或友元函數(shù),則其派生類(lèi)不因繼承關(guān)系也有此友元類(lèi)或友元函數(shù)。因繼承關(guān)系也有此友元類(lèi)或友元函數(shù)。v如果基類(lèi)是某類(lèi)的友元,則這種友元關(guān)系如果基類(lèi)是某類(lèi)的友元,則這種友元關(guān)系是是被繼承被繼承的。即,被派生類(lèi)繼承過(guò)來(lái)的成的。即,被派生類(lèi)繼承過(guò)來(lái)的成員,如果原來(lái)是某類(lèi)的友元,那么它作為員,如果原來(lái)是某類(lèi)的友元,那么它作為派生類(lèi)的成員仍然是某類(lèi)的友元。總之:

42、派生類(lèi)的成員仍然是某類(lèi)的友元??傊?基類(lèi)的友元不一定是派生類(lèi)的友元;基類(lèi)的友元不一定是派生類(lèi)的友元; 基類(lèi)的成員是某類(lèi)的友元,則其作為派生類(lèi)繼基類(lèi)的成員是某類(lèi)的友元,則其作為派生類(lèi)繼承的成員仍是某類(lèi)的友元。承的成員仍是某類(lèi)的友元。Database & Information System Lab43http:/靜態(tài)成員的繼承靜態(tài)成員的繼承v如果基類(lèi)中被派生類(lèi)繼承的成員是靜態(tài)成如果基類(lèi)中被派生類(lèi)繼承的成員是靜態(tài)成員,則其靜態(tài)屬性也隨靜態(tài)成員被繼承。員,則其靜態(tài)屬性也隨靜態(tài)成員被繼承。v如果基類(lèi)的靜態(tài)成員是公有的或是保護(hù)的,如果基類(lèi)的靜態(tài)成員是公有的或是保護(hù)的,則它們被其派生類(lèi)繼承為派生

43、類(lèi)的靜態(tài)成則它們被其派生類(lèi)繼承為派生類(lèi)的靜態(tài)成員。即:?jiǎn)T。即: 這些成員通常用這些成員通常用“:”方式方式引用或調(diào)用。引用或調(diào)用。 這些成員無(wú)論有多少個(gè)對(duì)象被創(chuàng)建,都只有一這些成員無(wú)論有多少個(gè)對(duì)象被創(chuàng)建,都只有一個(gè)拷貝。它為基類(lèi)和派生類(lèi)的所有對(duì)象所共享。個(gè)拷貝。它為基類(lèi)和派生類(lèi)的所有對(duì)象所共享。 Database & Information System Lab44http:/賦值兼容性問(wèn)題賦值兼容性問(wèn)題v派生類(lèi)對(duì)象間的賦值操作依據(jù)下面的原則:派生類(lèi)對(duì)象間的賦值操作依據(jù)下面的原則: 如果派生類(lèi)有自己的賦值運(yùn)算符的重載定義,如果派生類(lèi)有自己的賦值運(yùn)算符的重載定義,即按重載后的運(yùn)算符含義處

44、理。即按重載后的運(yùn)算符含義處理。 派生類(lèi)未定義自己的賦值操作,而基類(lèi)定義了派生類(lèi)未定義自己的賦值操作,而基類(lèi)定義了賦值操作,則系統(tǒng)自動(dòng)定義派生類(lèi)賦值操作,賦值操作,則系統(tǒng)自動(dòng)定義派生類(lèi)賦值操作,其中基類(lèi)成員的賦值按基類(lèi)的賦值操作進(jìn)行。其中基類(lèi)成員的賦值按基類(lèi)的賦值操作進(jìn)行。 二者都未定義專(zhuān)門(mén)的賦值操作,系統(tǒng)自動(dòng)定義二者都未定義專(zhuān)門(mén)的賦值操作,系統(tǒng)自動(dòng)定義缺省賦值操作(按位進(jìn)行拷貝)。缺省賦值操作(按位進(jìn)行拷貝)。Database & Information System Lab45http:/賦值兼容性問(wèn)題賦值兼容性問(wèn)題v基類(lèi)對(duì)象和派生類(lèi)對(duì)象之間允許有下述的基類(lèi)對(duì)象和派生類(lèi)對(duì)象之間允許

45、有下述的賦值關(guān)系(賦值關(guān)系(允許將派生類(lèi)對(duì)象允許將派生類(lèi)對(duì)象“當(dāng)作當(dāng)作”基基類(lèi)對(duì)象來(lái)使用類(lèi)對(duì)象來(lái)使用):): 基類(lèi)對(duì)象基類(lèi)對(duì)象 = = 派生類(lèi)對(duì)象;派生類(lèi)對(duì)象; 只賦只賦“共性成員共性成員”部分部分 ,反方向的賦值,反方向的賦值“派生類(lèi)派生類(lèi)對(duì)象對(duì)象 = = 基類(lèi)對(duì)象基類(lèi)對(duì)象”不被允許不被允許 指向基類(lèi)對(duì)象的指針指向基類(lèi)對(duì)象的指針 = = 派生類(lèi)對(duì)象的地址;派生類(lèi)對(duì)象的地址; 下述賦值不允許:指向派生類(lèi)類(lèi)型的指針下述賦值不允許:指向派生類(lèi)類(lèi)型的指針 = = 基類(lèi)基類(lèi)對(duì)象的地址。注:訪(fǎng)問(wèn)非基類(lèi)成員部分時(shí),要經(jīng)過(guò)對(duì)象的地址。注:訪(fǎng)問(wèn)非基類(lèi)成員部分時(shí),要經(jīng)過(guò)指針類(lèi)型的強(qiáng)制轉(zhuǎn)換指針類(lèi)型的強(qiáng)制轉(zhuǎn)換 基類(lèi)

46、的引用基類(lèi)的引用 = = 派生類(lèi)對(duì)象;派生類(lèi)對(duì)象; 下述賦值不允許:派生類(lèi)的引用下述賦值不允許:派生類(lèi)的引用 = = 基類(lèi)對(duì)象。基類(lèi)對(duì)象。 通過(guò)引用只可以訪(fǎng)問(wèn)基類(lèi)成員部分通過(guò)引用只可以訪(fǎng)問(wèn)基類(lèi)成員部分Database & Information System Lab46http:/賦值兼容性問(wèn)題賦值兼容性問(wèn)題v【例例8.48.4】讀程序,分析運(yùn)行結(jié)果讀程序,分析運(yùn)行結(jié)果#includeusing namespace std;class base /基類(lèi)基類(lèi)base int a;public: base (int sa) a=sa; int geta()return a; ; class

47、 derived:public base /派生類(lèi)派生類(lèi)derived int b; public: derived(int sa, int sb):base(sa) b=sb; int getb()return b; ;Database & Information System Lab47http:/賦值兼容性問(wèn)題賦值兼容性問(wèn)題void main () base bs1(123); / base 類(lèi)對(duì)象類(lèi)對(duì)象bs1coutbs1.geta()=bs1.geta()endl; derived der(246,468);/ derived 類(lèi)對(duì)象類(lèi)對(duì)象derbs1=der; /OK! “

48、基類(lèi)對(duì)象基類(lèi)對(duì)象 = 派生類(lèi)對(duì)象派生類(lèi)對(duì)象;”coutbs1.geta()=bs1.geta()endl; /der=bs1; /ERROR! “派生類(lèi)對(duì)象派生類(lèi)對(duì)象 = 基類(lèi)對(duì)象基類(lèi)對(duì)象;”Database & Information System Lab48http:/賦值兼容性問(wèn)題賦值兼容性問(wèn)題base *pb = &der;/“指向基類(lèi)型的指針指向基類(lèi)型的指針 = 派生類(lèi)對(duì)象的地址派生類(lèi)對(duì)象的地址;” coutgeta()=geta()endl; /訪(fǎng)問(wèn)基類(lèi)成員部分訪(fǎng)問(wèn)基類(lèi)成員部分/coutgetb()endl; /ERROR! 直接訪(fǎng)問(wèn)非基類(lèi)成員部分直接訪(fǎng)問(wèn)非基類(lèi)成員

49、部分coutgetb()=getb()geta()=246(derived *)pb)-getb()=468 Database & Information System Lab50http:/二義性問(wèn)題二義性問(wèn)題v單繼承時(shí)父類(lèi)與子類(lèi)間重名成員的處理單繼承時(shí)父類(lèi)與子類(lèi)間重名成員的處理 單繼承時(shí)父類(lèi)與子類(lèi)間成員重名時(shí),按如下規(guī)單繼承時(shí)父類(lèi)與子類(lèi)間成員重名時(shí),按如下規(guī)定進(jìn)行處理:對(duì)子類(lèi)而言,不加類(lèi)名限定時(shí)默定進(jìn)行處理:對(duì)子類(lèi)而言,不加類(lèi)名限定時(shí)默認(rèn)為是處理子類(lèi)成員,而要訪(fǎng)問(wèn)父類(lèi)重名成員認(rèn)為是處理子類(lèi)成員,而要訪(fǎng)問(wèn)父類(lèi)重名成員時(shí),則要通過(guò)類(lèi)名限定。時(shí),則要通過(guò)類(lèi)名限定。 【例例8.58.5】讀

50、程序,分析運(yùn)行結(jié)果讀程序,分析運(yùn)行結(jié)果#include using namespace std;class CB public:int a;CB(int x)a=x;void showa()coutClass CB - a=aendl; Database & Information System Lab51http:/二義性問(wèn)題二義性問(wèn)題class CD:public CB public:int a; /與基類(lèi)與基類(lèi)a同名同名CD(int x, int y):CB(x)a=y; void showa()/與基類(lèi)與基類(lèi)showa同名同名coutClass CD - a=aendl;voi

51、d print2a() couta=aendl; /子類(lèi)子類(lèi)acoutCB:a=CB:aendl; /父類(lèi)父類(lèi)a; Database & Information System Lab52http:/二義性問(wèn)題二義性問(wèn)題void main() CB CBobj(12);CBobj.showa();CD CDobj(48, 999);CDobj.showa();/子類(lèi)的子類(lèi)的showaCDobj.CB:showa(); /父類(lèi)的父類(lèi)的showa coutCDobj.a=CDobj.aendl;coutCDobj.CB:a=CDobj.CB:aendl; 程序執(zhí)行后的顯示結(jié)果如下:程序執(zhí)行后

52、的顯示結(jié)果如下:Class CB - a=12Class CD - a=999Class CB - a=48CDobj.a=999CDobj.CB:a=48Database & Information System Lab53http:/二義性問(wèn)題二義性問(wèn)題v多繼承情況下二基類(lèi)間重名成員的處理多繼承情況下二基類(lèi)間重名成員的處理 多繼承情況下二基類(lèi)間成員重名時(shí),按如下方多繼承情況下二基類(lèi)間成員重名時(shí),按如下方式進(jìn)行處理:對(duì)子類(lèi)而言,不加類(lèi)名限定時(shí)默式進(jìn)行處理:對(duì)子類(lèi)而言,不加類(lèi)名限定時(shí)默認(rèn)為是處理子類(lèi)成員,而要訪(fǎng)問(wèn)父類(lèi)重名成員認(rèn)為是處理子類(lèi)成員,而要訪(fǎng)問(wèn)父類(lèi)重名成員時(shí),則要通過(guò)類(lèi)名限定。

53、時(shí),則要通過(guò)類(lèi)名限定。 【例例8.68.6】讀程序,分析運(yùn)行結(jié)果讀程序,分析運(yùn)行結(jié)果#include using namespace std;class CB1 public:int a; CB1(int x)a=x;void showa()cout a=aendl; Database & Information System Lab54http:/二義性問(wèn)題二義性問(wèn)題class CB2 public:int a; CB2(int x)a=x;void showa()cout a=aendl;class CD:public CB1, public CB2 public:int a; /

54、與二基類(lèi)數(shù)據(jù)成員與二基類(lèi)數(shù)據(jù)成員a同名同名CD(int x, int y, int z): CB1(x), CB2(y) a=z;Database & Information System Lab55http:/二義性問(wèn)題二義性問(wèn)題void showa() /與二基類(lèi)成員函數(shù)與二基類(lèi)成員函數(shù)showa同名同名 cout a=aendl;void print3a() /顯示出派生類(lèi)的顯示出派生類(lèi)的a及其二父類(lèi)的重名成員及其二父類(lèi)的重名成員acouta=aendl; coutCB1:a=CB1:aendl;coutCB2:a=CB2:aendl;Database & Informa

55、tion System Lab56http:/二義性問(wèn)題二義性問(wèn)題void main() CB1 CB1obj(11);CB1obj.showa();CD CDobj(101, 202,909);CDobj.showa();/子類(lèi)子類(lèi)showaCDobj.CB1:showa();/父類(lèi)父類(lèi)showacoutCDobj.a=CDobj.aendl;coutCDobj.CB2:a=CDobj.CB2:a a=11Class CD = a=909Class CB1 = a=101CDobj.a=909CDobj.CB2:a=202Database & Information System L

56、ab57http:/二義性問(wèn)題二義性問(wèn)題v多級(jí)混合繼承多級(jí)混合繼承( (非虛擬繼承非虛擬繼承) )包含兩個(gè)基類(lèi)包含兩個(gè)基類(lèi)實(shí)例情況的處理實(shí)例情況的處理 多級(jí)混合繼承情況下,若類(lèi)多級(jí)混合繼承情況下,若類(lèi)D D從兩條不同從兩條不同“路路徑徑”同時(shí)對(duì)類(lèi)同時(shí)對(duì)類(lèi)A A進(jìn)行了一般性繼承(非虛擬繼進(jìn)行了一般性繼承(非虛擬繼承)的話(huà),則類(lèi)承)的話(huà),則類(lèi)D D的對(duì)象中會(huì)同時(shí)包含著兩個(gè)的對(duì)象中會(huì)同時(shí)包含著兩個(gè)類(lèi)類(lèi)A A的實(shí)例。此時(shí),對(duì)類(lèi)的實(shí)例。此時(shí),對(duì)類(lèi)D D而言,要通過(guò)類(lèi)名限而言,要通過(guò)類(lèi)名限定來(lái)指定訪(fǎng)問(wèn)兩個(gè)類(lèi)定來(lái)指定訪(fǎng)問(wèn)兩個(gè)類(lèi)A A實(shí)例中的哪一個(gè)。實(shí)例中的哪一個(gè)。 【例例8.78.7】讀程序,分析運(yùn)行結(jié)果讀

57、程序,分析運(yùn)行結(jié)果Database & Information System Lab58http:/二義性問(wèn)題二義性問(wèn)題 本例的類(lèi)間繼承關(guān)系示例如下本例的類(lèi)間繼承關(guān)系示例如下: :class Aclass B : public Aclass C : public Aclass D : public B, public C 存儲(chǔ)結(jié)構(gòu)示意存儲(chǔ)結(jié)構(gòu)示意: :( ( (A) B ) ( (A) C ) D ) 上述多級(jí)混合繼承關(guān)系應(yīng)用例舉上述多級(jí)混合繼承關(guān)系應(yīng)用例舉: : 例例1.1.類(lèi)類(lèi)A-A-人員類(lèi);人員類(lèi); 類(lèi)類(lèi)B-B-學(xué)生類(lèi);學(xué)生類(lèi); 類(lèi)類(lèi)C-C-助教類(lèi);助教類(lèi); 類(lèi)類(lèi)D-D-學(xué)生助教

58、類(lèi)。學(xué)生助教類(lèi)。 例例2.2.類(lèi)類(lèi)A-A-人員類(lèi);人員類(lèi); 類(lèi)類(lèi)B-B-學(xué)生類(lèi);學(xué)生類(lèi); 類(lèi)類(lèi)C-C-工人類(lèi);工人類(lèi); 類(lèi)類(lèi)D-D-工人學(xué)生類(lèi)。工人學(xué)生類(lèi)。 例例3.3.類(lèi)類(lèi)A-A-家具類(lèi);家具類(lèi); 類(lèi)類(lèi)B-B-沙發(fā)類(lèi);沙發(fā)類(lèi); 類(lèi)類(lèi)C-C-床類(lèi);床類(lèi); 類(lèi)類(lèi)D-D-沙發(fā)床類(lèi)。沙發(fā)床類(lèi)。Database & Information System Lab59http:/二義性問(wèn)題二義性問(wèn)題#include using namespace std;class A public:int a;A(int x)a=x; void showall()couta=aendl;class B:publ

59、ic A public:int b;B(int x):A(x-1)b=x;Database & Information System Lab60http:/二義性問(wèn)題二義性問(wèn)題class C:public A public:int c; C(int x):A(x-1)c=x;Database & Information System Lab61http:/二義性問(wèn)題二義性問(wèn)題class D:public B,public C public:int d;D(int x, int y, int z):B(x+1),C(y+2)d=z;void showall() coutC:a=C

60、:aendl;/在類(lèi)在類(lèi)D定義范圍內(nèi),要通過(guò)類(lèi)名限定來(lái)指定定義范圍內(nèi),要通過(guò)類(lèi)名限定來(lái)指定/訪(fǎng)問(wèn)兩個(gè)類(lèi)訪(fǎng)問(wèn)兩個(gè)類(lèi)A實(shí)例中的哪一個(gè)實(shí)例中的哪一個(gè)coutB:a=B:aendl;coutb,c,d=b, c, dendl;/b、c、d不重名,具有唯一性不重名,具有唯一性 ;Database & Information System Lab62http:/二義性問(wèn)題二義性問(wèn)題void main() D Dobj(101, 202, 909); Dobj.showall();cout-endl;coutDobj.C:a=Dobj.C:aendl;/訪(fǎng)問(wèn)類(lèi)訪(fǎng)問(wèn)類(lèi)D的從的從C繼承而來(lái)的繼承而來(lái)的acoutDobj.B:a=Dobj.B:aendl;程序執(zhí)行后的顯示結(jié)果如下:程序執(zhí)行后的顯示結(jié)果如下:C:a=203B:a=101b,c,d=102, 204, 909-Dobj.C:a=203Dobj.B:a=101Database & Information System Lab63http:/作業(yè)作業(yè)8.18.1v設(shè)計(jì)日期類(lèi)和時(shí)間類(lèi),并以此兩類(lèi)為基類(lèi)設(shè)計(jì)日期類(lèi)和時(shí)間類(lèi),并以此兩類(lèi)為基類(lèi)派生日期時(shí)間類(lèi)派生日期時(shí)間類(lèi) 要求:要求: 日期類(lèi)包括年、月、日等成員日期類(lèi)包括年、月、日等成員 時(shí)間類(lèi)包括

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論