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

下載本文檔

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

文檔簡介

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

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

3、em Lab4http:/類的繼承與派生類的繼承與派生v繼承繼承(inheritance)(inheritance)與派生與派生 該機制是面向對象程序設計使代碼可以復用的該機制是面向對象程序設計使代碼可以復用的最重要的手段最重要的手段 它允許程序員在保持原有類特性的基礎上進行它允許程序員在保持原有類特性的基礎上進行擴展,增加功能擴展,增加功能 繼承產(chǎn)生新的類,稱為繼承產(chǎn)生新的類,稱為派生類派生類 派生類可以訪問基類的保護成員(在基類中以關鍵派生類可以訪問基類的保護成員(在基類中以關鍵字字protected標識的成員)標識的成員) 繼承呈現(xiàn)了面向對象程序設計的層次結構,體繼承呈現(xiàn)了面向對象程序設

4、計的層次結構,體現(xiàn)了由簡單到復雜的認識過程現(xiàn)了由簡單到復雜的認識過程Database & Information System Lab5http:/類的繼承與派生類的繼承與派生v層次概念層次概念是計算機的重要概念。通過是計算機的重要概念。通過繼承繼承(inheritanceinheritance)的機制可對類()的機制可對類(classclass)分層,提供類型分層,提供類型/ /子類型的關系。子類型的關系。vC+C+通過通過類派生類派生(class derivationclass derivation)的機)的機制來支持繼承。被繼承的類稱為制來支持繼承。被繼承的類稱為基類基類(bas

5、e classbase class)或)或超類超類(superclasssuperclass),),新的類為新的類為派生類派生類(derived classderived class)或)或子類子類(subclasssubclass)。基類和派生類的集合稱作)?;惡团缮惖募戏Q作類繼承層次結構類繼承層次結構(hierarchyhierarchy)Database & Information System Lab6http:/類的繼承與派生類的繼承與派生v如果基類和派生類共享相同的公有接口,如果基類和派生類共享相同的公有接口,則派生類被稱作基類的則派生類被稱作基類的子類型子類型(su

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

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

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

9、:姓名、年齡、工資、行政級別、職務。別、職務。Database & Information System Lab9http:/類的繼承與派生類的繼承與派生#include #include using namespace std;class employee/employee類將作為其它幾個類的基類類將作為其它幾個類的基類 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:/類的繼承與派生類的繼承與派生void print ()cout name: ;coutage : ;coutsalaryendl; employee() deletename; ; Database & Information System Lab11http:/類的繼承與派生類的繼承與派生class manager:public employee /派生類派生類int level;public:manager(short ag, float sa, cha

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

12、為是處理子類成員,而要訪問父類重名成員時,則要通為是處理子類成員,而要訪問父類重名成員時,則要通過類名限定過類名限定*/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:/類的繼承與派生類的繼承與派生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)用基類的調(diào)用基類的print eng.print();dir.print();Database & Information System Lab14ht

14、tp:/類的繼承與派生類的繼承與派生程序執(zhí)行后的顯示結果如下:程序執(zhí)行后的顯示結果如下: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:/類的繼承與派生類的繼承與派生v單繼承單繼承 派生類只有一個直接基類的情況稱為單繼承派生類只有一個直接基類的情況稱為單繼承(s

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

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

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

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

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

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

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

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

23、rivateprivateprivateprivateprivate(inaccessible)(inaccessible) =Database & Information System Lab24http:/派生類的訪問權限派生類的訪問權限vpublicpublic派生方式派生方式 使基類的公有成員和保護成員在派生類中仍然使基類的公有成員和保護成員在派生類中仍然是公有成員和保護成員,而基類的私有成員不是公有成員和保護成員,而基類的私有成員不可在派生類中被存取??稍谂缮愔斜淮嫒 protectedprotected派生方式派生方式 使基類的公有成員和保護成員在派生類中都變使基類的公

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

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

26、加的包括在派生類中新增加的protectedprotected保護成員以及保護成員以及從基類繼承過來的某些成員。這些成員在派生類中從基類繼承過來的某些成員。這些成員在派生類中是可以訪問的。是可以訪問的。 公有成員公有成員 包括在派生類中新增加的包括在派生類中新增加的publicpublic公有成員以及從基公有成員以及從基類公有繼承過來的基類的類公有繼承過來的基類的publicpublic成員。這些成員不成員。這些成員不僅在派生類中可以訪問,而且在建立派生類對象的僅在派生類中可以訪問,而且在建立派生類對象的模塊中,也可以通過對象來訪問它們模塊中,也可以通過對象來訪問它們Database &

27、; Information System Lab27http:/派生類的訪問權限派生類的訪問權限v【例例8.28.2】讀程序,分析運行結果讀程序,分析運行結果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:/派生類的訪問權限派生類的訪問權限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:/派生類的訪問權限派生類的訪問權限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:/派生類的訪問權限派生類的訪問權限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:/派生類的訪問權限派生類的訪問權限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:/派生類對象的說明派生類對象的說明v派生類對象的說明與所有類對象的說明方派生類對象的說明與所有類對象的說明方式相同式相同 ,nv類對象進行說明的同時,需要進行初始化類對象進行說明的同時,需要進行初始化 初始化列表初始化列表 派生類的構造函數(shù)派生類的構造函數(shù)Database & Information System Lab33http:

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

34、構造函數(shù),調(diào)用順序為派生繼承調(diào)用各基類的構造函數(shù),調(diào)用順序為派生繼承時的時的基類聲明順序基類聲明順序。 若派生類含有對象成員的話,調(diào)用各對象成員若派生類含有對象成員的話,調(diào)用各對象成員的構造函數(shù),調(diào)用順序按照派生類中的構造函數(shù),調(diào)用順序按照派生類中對象成員對象成員的聲明順序的聲明順序。 執(zhí)行派生類構造函數(shù)的函數(shù)體。執(zhí)行派生類構造函數(shù)的函數(shù)體。Database & Information System Lab35http:/派生類的構造函數(shù)派生類的構造函數(shù)v派生類構造函數(shù)與基類構造函數(shù)的聯(lián)系派生類構造函數(shù)與基類構造函數(shù)的聯(lián)系 在派生類構造函數(shù)中,只要基類不是使用無參在派生類構造函數(shù)中,只

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

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

37、例8.38.3】讀程序,分析運行結果讀程序,分析運行結果#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:/派生類的說明與初始化派生類的說明與

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:/派生類的說明與初始化派生類的說明與初始化運行結果為:運行結果為:CB:b=4CC:c=6CD:d=2CDobj is

39、 destructingCCobj is destructingCBobj is destrcting 【思考思考】將派生類將派生類CDCD改寫為如下形式后,請給出輸改寫為如下形式后,請給出輸出結果。出結果。 Database & Information System Lab40http:/派生類的說明與初始化派生類的說明與初始化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/先基類先基類CB、CC,再對象成員,再對象成員CC、CB,最后派生類,最后派生類CDhttp:/派生類的說明與初始化派生類的說明與初始化輸出結果:輸出結果: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基類的友元不繼承基類的友元不繼承 如果基類有友元類或友元函數(shù),則其派生類不如果基類有友元類或友元函數(shù),則其派生類不因繼承關系也有此友元類或友元函數(shù)。因繼承關系也有此友元類或友元函數(shù)。v如果基類是某類的友元,則這種友元關系如果基類是某類的友元,則這種友元關系是是被繼承被繼承的。即,被派生類繼承過來的成的。即,被派生類繼承過來的成員,如果原來是某類的友元,那么它作為員,如果原來是某類的友元,那么它作為派生類的成員仍然是某類的友元。總之:

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

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

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

45、有下述的賦值關系(賦值關系(允許將派生類對象允許將派生類對象“當作當作”基基類對象來使用類對象來使用):): 基類對象基類對象 = = 派生類對象;派生類對象; 只賦只賦“共性成員共性成員”部分部分 ,反方向的賦值,反方向的賦值“派生類派生類對象對象 = = 基類對象基類對象”不被允許不被允許 指向基類對象的指針指向基類對象的指針 = = 派生類對象的地址;派生類對象的地址; 下述賦值不允許:指向派生類類型的指針下述賦值不允許:指向派生類類型的指針 = = 基類基類對象的地址。注:訪問非基類成員部分時,要經(jīng)過對象的地址。注:訪問非基類成員部分時,要經(jīng)過指針類型的強制轉換指針類型的強制轉換 基類

46、的引用基類的引用 = = 派生類對象;派生類對象; 下述賦值不允許:派生類的引用下述賦值不允許:派生類的引用 = = 基類對象?;悓ο蟆?通過引用只可以訪問基類成員部分通過引用只可以訪問基類成員部分Database & Information System Lab46http:/賦值兼容性問題賦值兼容性問題v【例例8.48.4】讀程序,分析運行結果讀程序,分析運行結果#includeusing namespace std;class base /基類基類base int a;public: base (int sa) a=sa; int geta()return a; ; class

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

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

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

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

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

52、的顯示結果如下:Class CB - a=12Class CD - a=999Class CB - a=48CDobj.a=999CDobj.CB:a=48Database & Information System Lab53http:/二義性問題二義性問題v多繼承情況下二基類間重名成員的處理多繼承情況下二基類間重名成員的處理 多繼承情況下二基類間成員重名時,按如下方多繼承情況下二基類間成員重名時,按如下方式進行處理:對子類而言,不加類名限定時默式進行處理:對子類而言,不加類名限定時默認為是處理子類成員,而要訪問父類重名成員認為是處理子類成員,而要訪問父類重名成員時,則要通過類名限定。

53、時,則要通過類名限定。 【例例8.68.6】讀程序,分析運行結果讀程序,分析運行結果#include using namespace std;class CB1 public:int a; CB1(int x)a=x;void showa()cout a=aendl; Database & Information System Lab54http:/二義性問題二義性問題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、與二基類數(shù)據(jù)成員與二基類數(shù)據(jù)成員a同名同名CD(int x, int y, int z): CB1(x), CB2(y) a=z;Database & Information System Lab55http:/二義性問題二義性問題void showa() /與二基類成員函數(shù)與二基類成員函數(shù)showa同名同名 cout a=aendl;void print3a() /顯示出派生類的顯示出派生類的a及其二父類的重名成員及其二父類的重名成員acouta=aendl; coutCB1:a=CB1:aendl;coutCB2:a=CB2:aendl;Database & Informa

55、tion System Lab56http:/二義性問題二義性問題void main() CB1 CB1obj(11);CB1obj.showa();CD CDobj(101, 202,909);CDobj.showa();/子類子類showaCDobj.CB1:showa();/父類父類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:/二義性問題二義性問題v多級混合繼承多級混合繼承( (非虛擬繼承非虛擬繼承) )包含兩個基類包含兩個基類實例情況的處理實例情況的處理 多級混合繼承情況下,若類多級混合繼承情況下,若類D D從兩條不同從兩條不同“路路徑徑”同時對類同時對類A A進行了一般性繼承(非虛擬繼進行了一般性繼承(非虛擬繼承)的話,則類承)的話,則類D D的對象中會同時包含著兩個的對象中會同時包含著兩個類類A A的實例。此時,對類的實例。此時,對類D D而言,要通過類名限而言,要通過類名限定來指定訪問兩個類定來指定訪問兩個類A A實例中的哪一個。實例中的哪一個。 【例例8.78.7】讀程序,分析運行結果讀

57、程序,分析運行結果Database & Information System Lab58http:/二義性問題二義性問題 本例的類間繼承關系示例如下本例的類間繼承關系示例如下: :class Aclass B : public Aclass C : public Aclass D : public B, public C 存儲結構示意存儲結構示意: :( ( (A) B ) ( (A) C ) D ) 上述多級混合繼承關系應用例舉上述多級混合繼承關系應用例舉: : 例例1.1.類類A-A-人員類;人員類; 類類B-B-學生類;學生類; 類類C-C-助教類;助教類; 類類D-D-學生助教

58、類。學生助教類。 例例2.2.類類A-A-人員類;人員類; 類類B-B-學生類;學生類; 類類C-C-工人類;工人類; 類類D-D-工人學生類。工人學生類。 例例3.3.類類A-A-家具類;家具類; 類類B-B-沙發(fā)類;沙發(fā)類; 類類C-C-床類;床類; 類類D-D-沙發(fā)床類。沙發(fā)床類。Database & Information System Lab59http:/二義性問題二義性問題#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:/二義性問題二義性問題class C:public A public:int c; C(int x):A(x-1)c=x;Database & Information System Lab61http:/二義性問題二義性問題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;/在類在類D定義范圍內(nèi),要通過類名限定來指定定義范圍內(nèi),要通過類名限定來指定/訪問兩個類訪問兩個類A實例中的哪一個實例中的哪一個coutB:a=B:aendl;coutb,c,d=b, c, dendl;/b、c、d不重名,具有唯一性不重名,具有唯一性 ;Database & Information System Lab62http:/二義性問題二義性問題void main() D Dobj(101, 202, 909); Dobj.showall();cout-endl;coutDobj.C:a=Dobj.C:aendl;/訪問類訪問類D的從的從C繼承而來的繼承而來的acoutDobj.B:a=Dobj.B:aendl;程序執(zhí)行后的顯示結果如下:程序執(zhí)行后的顯示結果如下: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設計日期類和時間類,并以此兩類為基類設計日期類和時間類,并以此兩類為基類派生日期時間類派生日期時間類 要求:要求: 日期類包括年、月、日等成員日期類包括年、月、日等成員 時間類包括

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論