版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
C++面向?qū)ο蟪绦蛟O(shè)計(第二版)
主編曹靜中國水利水電出版社C++面向?qū)ο蟪绦蛟O(shè)計(第二版)
第五章
類的繼承與派生13一月2023C++面向?qū)ο蟪绦蛟O(shè)計第五章
類的繼承與派生5.1繼承與派生5.2繼承的三種方式5.3派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)5.4多繼承和虛基類5.5賦值兼容規(guī)則13一月2023C++面向?qū)ο蟪绦蛟O(shè)計5.1繼承與派生5.1.1基類與派生類5.1.2派生類的聲明5.1.3派生類生成過程13一月2023C++面向?qū)ο蟪绦蛟O(shè)計5.1.1基類與派生類以原有的類為基礎(chǔ)產(chǎn)生新類,我們就說從原有的類派生出新類。在這個過程中原有的類稱為基類,新類稱為派生類。汽車類派生出卡車類。在此過程中,我們稱汽車類為基類,卡車類為汽車類的派生類。面向?qū)ο蟪绦蛟O(shè)計提供了類的繼承機制,該機制自動的為派生類提供了其基類的操作和屬性,大大的提高了代碼的重用率。13一月2023C++面向?qū)ο蟪绦蛟O(shè)計5.1.2派生類的聲明C++中聲明派生類的形式為:聲明中的“基類名”是已經(jīng)存在的類的名稱,“派生類名”是在已存在的類的基礎(chǔ)上通過添加成員而得到的新類。當派生類只有一個直接基類的繼承情況,稱為單繼承。當派生類同時有多個基類的繼承情況,稱為多繼承。class派生類名:繼承方式基類名1,繼承方式基類名2,…,繼承方式基類名n{
派生類的成員聲明;};13一月2023C++面向?qū)ο蟪绦蛟O(shè)計5.1.3派生類生成過程派生類生成過程中需要指定派生類的類名,繼承方式和新增成員。派生類的生成過程可分為三個步驟:吸收基類成員﹑改造基類成員和添加新的成員。吸收基類成員:將基類除構(gòu)造函數(shù)和析構(gòu)函數(shù)以外的成員全部接受。改造基類成員:根據(jù)繼承方式?jīng)Q定基類成員在派生類中的訪問控制問題。添加新的成員:派生類新增成員是派生類不同于基類的地方,也是繼承和派生機制的關(guān)鍵所在。13一月2023C++面向?qū)ο蟪绦蛟O(shè)計5.2繼承的三種方式5.2.1公有繼承5.2.2私有繼承5.2.3保護繼承13一月2023C++面向?qū)ο蟪绦蛟O(shè)計5.2.1公有繼承類的繼承方式為公有繼承的時候,基類的公有和保護成員在派生類中訪問權(quán)限不變,而基類的私有成員在派生類中不可直接訪問。公有繼承的應(yīng)用舉例。
classCircle:publicPoint{private:
floatr;public:
voidStart(floatX,floatY,floatR){Point::Start(X,Y);r=R;} floatGetR(){returnr;}};13一月2023C++面向?qū)ο蟪绦蛟O(shè)計5.2.2私有繼承類的繼承方式為私有繼承的時候,基類中的公有和保護成員被吸收后成為派生類的私有成員,而基類的私有成員在派生類中不可直接訪問。私有繼承應(yīng)用舉例。classCircle:privatePoint{private:
floatr;public:voidStart(floatX,floatY,floatR){Point::Start(X,Y);r=R;} floatGetX(){returnPoint::GetX();} floatGetY(){returnPoint::GetY();}};13一月2023C++面向?qū)ο蟪绦蛟O(shè)計5.2.3保護繼承當類的繼承方式為保護繼承的時候,基類中的公有和保護成員被吸收后成為派生類的保護成員,而基類中的私有成員在派生類中不可直接訪問。保護繼承的例子。classCircle:protectedPoint{private:floatr;public:voidStart(floatX,floatY,floatR){Point::Start(X,Y);r=R;} floatGetR(){returnr;} floatGetY(){returnPoint::GetY();}};13一月2023C++面向?qū)ο蟪绦蛟O(shè)計5.3派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)5.3.1構(gòu)造函數(shù)5.3.2析構(gòu)函數(shù)13一月2023C++面向?qū)ο蟪绦蛟O(shè)計5.3.1構(gòu)造函數(shù)派生類對象在定義的時候必須調(diào)用派生類的構(gòu)造函數(shù)進行初始化工作,也就是為派生類對象的數(shù)據(jù)成員賦初值。構(gòu)造函數(shù)的作用是在對象被創(chuàng)建時用特定的方式構(gòu)造對象,將對象初始化為一個特定的狀態(tài),使此對象具有區(qū)別于其它對象的特征。派生類對象的數(shù)據(jù)成員包括從基類繼承的數(shù)據(jù)成員和派生類新增的數(shù)據(jù)成員,如果派生類有內(nèi)嵌對象作為數(shù)據(jù)成員,那么派生類的數(shù)據(jù)成員還包括內(nèi)嵌對象的數(shù)據(jù)成員。派生類對象定義的時候,構(gòu)造函數(shù)需要完成上述數(shù)據(jù)成員的初始化工作。派生類構(gòu)造函數(shù)聲明一般語法如下:13一月2023C++面向?qū)ο蟪绦蛟O(shè)計5.3.1構(gòu)造函數(shù)派生類類名::派生類類名(參數(shù)列表):基類名1(參數(shù)列表1),…基類名m(參數(shù)列表m),
內(nèi)嵌對象名1(內(nèi)嵌對象參數(shù)列表1),……內(nèi)嵌對象n(內(nèi)嵌對象參數(shù)列表n){派生類新增成員的初始化;}派生類構(gòu)造函數(shù)初始化時先調(diào)用基類構(gòu)造函數(shù)完成從基類繼承數(shù)據(jù)成員的初始化,接著調(diào)用內(nèi)嵌對象的構(gòu)造函數(shù)完成內(nèi)嵌對象數(shù)據(jù)成員的初始化,最后才調(diào)用派生類構(gòu)造函數(shù)完成新增數(shù)據(jù)成員的初始化。13一月2023C++面向?qū)ο蟪绦蛟O(shè)計5.3.1構(gòu)造函數(shù)派生類構(gòu)造函數(shù)應(yīng)用舉例。classGraduateStudent:
publicStudent{protected: intgCount;public: GraduateStudent(intgN,floatgG,intgC):
Student(gN,gG) { cout<<"ConstructingGraduateStudent\n"; gCount=gC; }};13一月2023C++面向?qū)ο蟪绦蛟O(shè)計5.3.2析構(gòu)函數(shù)派生類的析構(gòu)函數(shù)是在派生類對象生命期結(jié)束之前對派生類新增的數(shù)據(jù)成員完成必要的清理工作。析構(gòu)函數(shù)的作用與構(gòu)造函數(shù)幾乎正好相反,它在對象刪除前被自動調(diào)用,來完成一些清理工作,也就是一些掃尾工作。派生類析構(gòu)函數(shù)執(zhí)行順序和構(gòu)造函數(shù)剛好相反:首先對派生類新增一般數(shù)據(jù)成員進行清理工作,接著對派生類內(nèi)嵌對象成員進行清理工作,最后才是對基類繼承的成員進行清理。這一點,大家可以根據(jù)棧區(qū)“先進后出”的特性來理解。13一月2023C++面向?qū)ο蟪绦蛟O(shè)計5.3.2析構(gòu)函數(shù)派生類析構(gòu)函數(shù)應(yīng)用舉例。classGraduateStudent:publicStudent{protected: intgCount;public: ~GraduateStudent() { cout<<"DestructingGraduateStudent\n"; }};13一月2023C++面向?qū)ο蟪绦蛟O(shè)計5.4多繼承和虛基類5.4.1派生類成員的標識與訪問5.4.2作用域分辨5.4.3多繼承和虛基類5.4.4虛基類及其派生類的構(gòu)造函數(shù)13一月2023C++面向?qū)ο蟪绦蛟O(shè)計5.4.1派生類成員的標識與訪問派生類吸收了基類除構(gòu)造函數(shù)和析構(gòu)函數(shù)以外的所有成員,并添加新成員得到的類。按照派生類對象能否直接訪問可以把派生類數(shù)據(jù)成員分為兩種??梢姵蓡T。派生類的可見成員也就是派生類的公有成員:派生類從基類繼承的公有成員和派生類新增的公有成員.不可見成員。派生類的不可見成員就是派生類的私有成員和保護成員:派生類從基類繼承的私有、保護成員和派生類新增的私有、保護成員。13一月2023C++面向?qū)ο蟪绦蛟O(shè)計5.4.2作用域分辨作用域分辨解決的是派生類中的同名覆蓋現(xiàn)象。派生類聲明了和基類同名的新成員(如果是函數(shù)成員則所帶參數(shù)必須相同,否則就是函數(shù)重載),派生類的新成員就覆蓋了從基類繼承的同名成員。直接訪問只能訪問派生類新增成員。為了能夠訪問基類同名成員,我們采用了作用域分辨符來完成這個任務(wù)。作用域分辨符的使用形式:
基類名::成員名;//數(shù)據(jù)成員基類名::成員名(參數(shù)表);//函數(shù)成員13一月2023C++面向?qū)ο蟪绦蛟O(shè)計5.4.3多繼承和虛基類多繼承是指一個派生類同時有多個直接基類,即一個派生類對象含有多個基類數(shù)據(jù)成員的拷貝。由于多層次的交叉派生關(guān)系,多繼承中一個派生類可能保留某個基類的多個實例。虛基類就是為了解決多繼承時一個派生類可能保留某個基類多個拷貝的問題。采用虛基類的派生方式保證了在多繼承中某個基類的拷貝只出現(xiàn)一次。13一月2023C++面向?qū)ο蟪绦蛟O(shè)計5.4.4虛基類及其派生類的構(gòu)造函數(shù)如果虛基類定義有帶參數(shù)的構(gòu)造函數(shù),那么派生類一定要定義帶參數(shù)的構(gòu)造函數(shù)。如果派生類對象中含有從虛基類繼承來的成員,則虛基類的成員是由最遠派生類的構(gòu)造函數(shù)通過調(diào)用虛基類的構(gòu)造函數(shù),進行初始化。13一月2023C++面向?qū)ο蟪绦蛟O(shè)計5.5賦值兼容規(guī)則賦值兼容規(guī)則是指在需要基類對象的任何地方都可以使用公有派生類的對象來替代。在替代之后,派生類對象就可以作為基類的對象使用,但只能使用從基類繼承的成員。賦值兼容規(guī)則替代的幾種情況:
派生類的對象可以賦值給基類對象。派生類的對象可以初始化基類的引用。派生類的對象的地址可以賦給指向基類的指針。13一月2023C++面向?qū)ο蟪绦蛟O(shè)計5.5賦值兼容規(guī)則賦值兼容規(guī)則應(yīng)用舉例。class
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度商業(yè)空間櫥柜批量采購及安裝合同范本4篇
- 2025年度廚師長職位競聘與餐飲文化傳承合同4篇
- 農(nóng)民工勞動合同簽訂與權(quán)益保護2025年度操作指南2篇
- 2025年度二零二五苗木種植項目土壤檢測采購合同4篇
- 二零二五版門面房租賃退租條件及流程協(xié)議2篇
- 2025年度二零二五年度農(nóng)副業(yè)冷鏈物流承包合同書4篇
- 二零二五年度跨境電商合作協(xié)議(進口貿(mào)易專版)4篇
- 2025年度環(huán)保技術(shù)合作居間合同范本4篇
- 2025年度個人房屋租賃合同(短期租賃版)2篇
- 2025年度制造業(yè)派遣工人勞動合同范本4篇
- 2023年廣東省公務(wù)員錄用考試《行測》真題及答案解析
- 2024年公證遺產(chǎn)繼承分配協(xié)議書模板
- 燃氣經(jīng)營安全重大隱患判定標準課件
- 深圳小學英語單詞表(中英文)
- 護理質(zhì)量反饋內(nèi)容
- 山東省濟寧市2023年中考數(shù)學試題(附真題答案)
- 抖音搜索用戶分析報告
- 鉆孔灌注樁技術(shù)規(guī)范
- 2023-2024學年北師大版必修二unit 5 humans and nature lesson 3 Race to the pole 教學設(shè)計
- 供貨進度計劃
- 彌漫大B細胞淋巴瘤護理查房
評論
0/150
提交評論