版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第五章繼承與派生2023/4/232派生類的引入C++的類提供了良好的模塊分解技術(shù),也具有可重用軟件所期望的品質(zhì):它們是相似一致的模塊,通過信息隱藏,將它們的接口和實(shí)現(xiàn)清楚地分開來。我們還希望在類的基礎(chǔ)上能取得更好的可重用性和可擴(kuò)充性的目標(biāo)。面向?qū)ο蟮睦^承技術(shù)提供了實(shí)現(xiàn)上述目標(biāo)的有力手段。2023/4/233現(xiàn)實(shí)中的繼承與派生在自然界中,繼承這個(gè)概念是非常普遍的。例如:小貓仔繼承了貓爸貓媽的特性,所以長的是貓鼻子貓眼,我們不會把它錯(cuò)認(rèn)為是小狗。繼承就是將一些本質(zhì)的特性遺傳給子代,使后代在很大程度上具有與父代相同的性質(zhì)。子代同時(shí)還具有父代沒有的特性。2023/4/234再來看一個(gè)現(xiàn)實(shí)世界中的例子:RectangleSquareDiamondParallelogramQuadrangle四邊形是一個(gè)基本的概念,矩形、正方形、菱形和平行四邊形都是派生的概念,因?yàn)樗鼈兌紝儆谒倪呅?,它們繼承了四邊形的所有性質(zhì),同時(shí)又?jǐn)U充出各自的特性。2023/4/235不具有對稱性不是所有植物都屬于蕨類傳遞性
高等植物、蕨類植物、芒萁都是植物,具有植物的共同特征植物
低等植物高等植物藻類菌類地衣類苔蘚類蕨類裸子類被子類地錢小金發(fā)草毛蕨芒萁杉木柏木荔枝橘子再來看一個(gè)現(xiàn)實(shí)世界中的例子:2023/4/236從上面的例子可以看出:而且子代可以擁有父代沒有的特性,這是可擴(kuò)充的概念。一旦指定了某種事物父代的本質(zhì)特征,那么它的子代將會自動具有那些性質(zhì)。這就是一種樸素的可重用的概念。2023/4/237從軟件設(shè)計(jì)的角度來看:基于已有的類,可以建立新的類。這個(gè)新的類既重用已有類的功能,又?jǐn)U展了新的功能。類是某類事物共同特性的體現(xiàn),它對外提供了特定的功能。2023/4/238C++的繼承關(guān)系繼承就是在一個(gè)已經(jīng)存在的類的基礎(chǔ)上建立另一個(gè)新的類。基類派生類已存在的類稱為“基類”或“父類”,新建立的類稱為“派生類”或“子類”,如圖所示:2023/4/239派生類的功能主要通過以下方式來體現(xiàn):派生類的特性吸收基類成員添加新成員改造基類成員從編碼的角度來看,派生類從基類中以較低的代價(jià)換來了較大的靈活性。一旦產(chǎn)生了可靠的基類,只需要調(diào)試派生類中所作的修改即可。派生類可以對繼承的屬性進(jìn)行擴(kuò)展、限制或改變。2023/4/2310單繼承和多繼承單繼承:派生類只有一個(gè)直接基類ABC單繼承XYZ多繼承多繼承:派生類有多個(gè)直接基類2023/4/2311單繼承派生類定義單繼承派生類的語法格式:
class派生類名:<繼承方式>基類名{ ……//派生類新添加的成員 };“繼承方式”可以是public、private、以及protected。雖然繼承了基類的所有成員,但是派生類并非都能訪問基類的所有成員,繼承方式會影響派生類對基類中各種成員的引用。2023/4/2312公有派生類在聲明派生類時(shí)將繼承方式指定為public時(shí),該類稱為公有派生類。class派生類名:public基類名
{ ……//派生類新添加的成員};2023/4/23137.2.1訪問控制public成員protected成員private成員public成員protected成員private成員基類派生類2023/4/2314基類的成員在公有派生類中的引用權(quán)限基類公有成員私有成員保護(hù)成員公有派生類公有成員不可訪問成員保護(hù)成員不可訪問成員在類外不能被直接訪問。在派生類的類內(nèi)不能被直接訪問。2023/4/2315舉例:公有派生classBase{ intv1;public: intv2; Base(inta=0,intb=0){ v1=a;v2=b; }};classDerived:publicBase{ intv3;public: intv4; Derived(inta=0,intb=0){ v3=a;v4=b; } voidfunc(){ intsum1=v1+v2+v3+v4; intsum2=v2+v3+v4; }};voidmain(){ Derivedobj(5,6); obj.v2=8;}//錯(cuò)誤2023/4/2316私有派生類在聲明派生類時(shí)將繼承方式指定為private時(shí),該類稱為私有派生類。class派生類名:private基類名{……//派生類新添加的成員};2023/4/2317基類的成員在私有派生類中的引用權(quán)限基類公有成員私有成員保護(hù)成員私有派生類私有成員不可訪問成員私有成員2023/4/2318舉例:私有派生classBase{ intv1;public: intv2; Base(inta=0,intb=0){ v1=a;v2=b; }};classDerived:privateBase{ intv3;public: intv4; Derived(inta=0,intb=0){ v3=a;v4=b; } voidfunc(){ intsum1=v1+v2+v3+v4; intsum2=v2+v3+v4; }};voidmain(){ Derivedobj(5,6); obj.v2=8;//錯(cuò)誤//錯(cuò)誤2023/4/2319公有派生和私有派生的比較雖然派生類繼承了基類所有的成員,但是基類的私有成員對于派生類來說是不可見的,因此不能被派生類所訪問?;惞谐蓡T私有成員保護(hù)成員公有派生類公有成員不可訪問成員保護(hù)成員私有派生類私有成員不可訪問成員私有成員2023/4/2320保護(hù)成員的引入為了解決這個(gè)問題,C++專門設(shè)置了保護(hù)成員,即用protected關(guān)鍵字說明的成員。保護(hù)成員的特性:能夠被基類和派生類所訪問。和私有成員一樣,類外不能訪問。2023/4/2321舉例:保護(hù)成員classBase{protected: intv1;public: intv2; Base(inta=0,intb=0){ v1=a;v2=b; }};classDerived:publicBase{ intv3;public: intv4; Derived(inta=0,intb=0){ v3=a;v4=b; } voidfunc(){ intsum1=v1+v2+v3+v4; intsum2=v2+v3+v4; }};voidmain(){ Derivedobj(5,6); obj.v1=8;}//錯(cuò)誤//正確2023/4/2322保護(hù)派生類在聲明派生類時(shí)將繼承方式指定為protected時(shí),該類稱為保護(hù)派生類:class派生類名:protected基類名
{……//派生類新添加的成員};2023/4/2323基類的成員在保護(hù)派生類中的引用權(quán)限基類公有成員私有成員保護(hù)成員保護(hù)派生類保護(hù)成員不可訪問成員保護(hù)成員2023/4/2324小結(jié)不同的繼承方式,子類對基類中的成員的訪問權(quán)限如下表所示:基類公有成員私有成員保護(hù)成員公有派生類公有成員不可訪問成員保護(hù)成員保護(hù)派生類保護(hù)成員不可訪問成員保護(hù)成員私有派生類私有成員不可訪問成員私有成員2023/4/2325派生類與基類同名成員的訪問方式C++允許派生類可以重新定義基類的成員,此時(shí)稱派生類的成員覆蓋了基類的同名成員。如果在派生類中,想使用基類的同名成員,則可以顯式地使用類名+限定符的方式,如下所示:基類名::成員2023/4/2326舉例classBase{protected: intv1;public: intv2; Base(inta=0,intb=0){ v1=a;v2=b; }};classDerived:publicBase{ intv2;public: intv3; Derived(inta=0,intb=0){ v2=a;v3=b; } voidfunc(){
intsum1=v1+v2+v3;
intsum2=v1+Base::v2+v3; }};voidmain(){ Derivedobj(5,6); obj.v2=8;}//錯(cuò)誤 obj.Base::v2=9;//使用的是Derived中的v2//使用的是Base中的v22023/4/2327派生類對象的構(gòu)造和析構(gòu)派生類對象數(shù)據(jù)成員的構(gòu)成:從基類繼承過來的數(shù)據(jù)成員派生類自定義的數(shù)據(jù)成員如何初始化這幾部分?jǐn)?shù)據(jù)成員呢?基本數(shù)據(jù)類型類類型如何析構(gòu)派生類對象?2023/4/2328單繼承派生類的構(gòu)造函數(shù)派生類構(gòu)造函數(shù)(參數(shù)表):基類構(gòu)造函數(shù)(參數(shù)表),對象成員1(參數(shù)表),
…… 對象成員n(參數(shù)表),{
……//初始化自定義數(shù)據(jù)成員}如果基類使用的是缺省的構(gòu)造函數(shù)或不帶參數(shù)的構(gòu)造函數(shù),那么在初始化列表中可以省略“基類構(gòu)造函數(shù)(參數(shù)表)“這一項(xiàng)。如果沒有對象成員,那么在初始化列表中可以省略“對象成員(參數(shù)表)“這一項(xiàng)。2023/4/2329構(gòu)造函數(shù)的調(diào)用順序如下:構(gòu)造函數(shù)和析構(gòu)函數(shù)的調(diào)用順序先調(diào)用基類構(gòu)造函數(shù);再調(diào)用對象成員所屬類的構(gòu)造函數(shù);最后調(diào)用派生類構(gòu)造函數(shù);析構(gòu)函數(shù)的調(diào)用順序如下:再調(diào)用對象成員所屬類的析構(gòu)函數(shù);先調(diào)用派生類的析構(gòu)函數(shù);最后調(diào)用基類的析構(gòu)函數(shù);2023/4/2330舉例classBase{public:Base(){cout<<“Basecreated\n”;}};classDerived:publicBase{public:Derived(){cout<<“Derivedcreated\n”;}};voidmain(){ Derivedd;}2023/4/2331請分析classbase{ intx;public: base(inti):x(i){ cout<<"base\n"; }};classderived:publicbase{ inta;public: derived(inti):a(i*4),base(a){ cout<<"derived\n"; }};此時(shí)基類的數(shù)據(jù)成員x的值為多少?2023/4/2332賦值兼容規(guī)則在公有派生方式下,派生類對象可以作為基類對象來使用,具體方式如下:以上規(guī)則的具體使用方式:派生類的對象可以直接賦值給基類的對象基類對象的引用可以引用一個(gè)派生類對象基類對象的指針可以指向一個(gè)派生類對象BaseBobj;DerivedDobj;Bobj=Dobj;Base&refB=Dobj;Base*pB=&Dobj;2023/4/2333需要思考的兩個(gè)問題為什么是“派生類對象->基類對象”,而不是“基類對象->派生類對象”?其他繼承方式會有以上規(guī)則嗎?2023/4/2334解決第一個(gè)問題v1v2v1v2v3v4基類對象派生類對象基類對象和派生類對象的內(nèi)存布局方式當(dāng)一個(gè)派生類對象直接賦值給基類對象時(shí),不是所有的數(shù)據(jù)都賦給了基類對象,賦予的只是派生類對象的一部分。這部分叫做派生類對象的“切片”(sliced)。2023/4/2335解決第二個(gè)問題回憶一下不同的繼承方式,子類對基類中的成員的訪問權(quán)限:基類公有成員私有成員保護(hù)成員公有派生類公有成員不可訪問成員保護(hù)成員私有派生類私有成員不可訪問成員私有成員保護(hù)派生類保護(hù)成員不可訪問成員保護(hù)成員只有在公有派生的情況下,才有可能出現(xiàn)“基類的公有成員變成派生類的公有成員”的情況。2023/4/2336多繼承派生類派生類有多個(gè)直接基類,這叫多繼承。QuadrangleDiamondSquareRectangleQuadrangle2023/4/2337定義多繼承派生類的語法格式:class派生類名:<繼承方式1>基類名1, <繼承方式2>基類名2,
……{
……//派生類新添加的成員};2023/4/2338多繼承派生類對象的構(gòu)造和析構(gòu)多繼承派生類的構(gòu)造函數(shù):派生類名(參數(shù)表):基類名1(參數(shù)表1),
基類名2(參數(shù)表2),
對象成員1(參數(shù)表3), 對象成員2(參數(shù)表4),
…{ //派生類新添加的成員}2023/4/2339派生類構(gòu)造函數(shù)的執(zhí)行順序:先執(zhí)行所有基類的構(gòu)造函數(shù)(按這些基類被繼承時(shí)聲明順序依次執(zhí)行基類1、基類2的構(gòu)造函數(shù))。最后執(zhí)行派生類本身的構(gòu)造函數(shù)。再執(zhí)行對象成員所屬類的構(gòu)造函數(shù)(按照這些對象成員在類中定義的順序)。2023/4/2340多繼承中的二義性問題在多繼承中,一個(gè)類不可以重復(fù)成為另一個(gè)類的直接基類,但可以多次成為間接基類。此時(shí)派生類訪問基類成員時(shí)可能出現(xiàn)二義性。訪問共同基類的成員時(shí)可能出現(xiàn)二義性。訪問不同基類的具有相同名字成員時(shí)可能出現(xiàn)二義性。2023/4/2341訪問不同基類同名成員時(shí)的二義性
classA{public:
intvalue;voidf();};classB{public:intvalue;voidf();voidg();};classC:publicA,publicB{public:voidg();voidh();};voidmain(){CC1;
C1.f();
C1.value=9;}//出現(xiàn)二義性//出現(xiàn)二義性解決辦法是用類名對成員加以限定,例如:
C1.A::f();或者C1.B::f(); C1.A::value=9;或者C1.B::value=9;2023/4/2342訪問共同基類成員時(shí)的二義性
classA{ public: inta; voidg();};classB1:publicA{ intb1;};classB2:publicA{ intb2;};classC:publicB1,publicB2{ intc;public:intf();};voidmain(){CCobj;Cobj.a=8;Cobj.A::a=9;
Cobj.g();}//出現(xiàn)二義性//出現(xiàn)二義性//出現(xiàn)二義性解決辦法:Cobj.B1::a=9;或Cobj.B2::a=9;2023/4/2343以上類的關(guān)系如下圖所示:A(a,g())B1(b1)A(a,g())B2(b2)C(f(),c)類A是派生類C兩條繼承路徑上的一個(gè)公共基類,因此這個(gè)公共基類會在派生類對象中產(chǎn)生兩個(gè)基類子對象。雖然可以通過類限定符的方式避免二義性,但問題的關(guān)鍵在于我們不需要在派生類對象中存在多個(gè)基類對象的拷貝!如果要使這個(gè)公共基類在派生類中只產(chǎn)生一個(gè)基類子對象,則需要將這個(gè)基類設(shè)置為虛基類。2023/4/2344虛基類引進(jìn)虛基類的目的是為了解決二義性問題,使公共基類在其派生類對象中只產(chǎn)生一個(gè)基類子對象。虛基類說明格式如下:
virtual<繼承方式><基類名>在“繼承方式”前面用關(guān)鍵字virtual來說明2023/4/2345例子:虛基類的使用
classA{ public: inta; voidg();};classB1:virturalpublicA{ intb1;};classB2:virturalpublicA{ intb2;};classC:publicB1,publicB2{ intc;public:intf();};voidmain(){CCobj;Cobj.a=8;//或Cobj.A::a=9;Cobj.g();}2023/4/2346A(g(),a)B1(b1)
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 學(xué)生實(shí)習(xí)期間家長保證書
- 版汽運(yùn)運(yùn)輸合同
- 生鮮食品采購合同
- 煤炭購銷合同范本模板
- 政府采購合同履行
- 招標(biāo)談判文件的編輯技巧
- 商場店鋪接盤合同模板
- 房屋買賣合同補(bǔ)充協(xié)議范例
- 簡單易懂的投資理財(cái)合同
- 業(yè)績分享合同樣本
- 湖南涉外經(jīng)濟(jì)學(xué)院論文答辯高校通用ppt模版
- 南極磷蝦油100問專業(yè)版
- 機(jī)械課程設(shè)計(jì)說明書
- 北師大2019新版高中英語選擇性必修二UNIT 6 THE MEDIA單詞表
- 冰蓄冷系統(tǒng)技術(shù)方案及經(jīng)濟(jì)性分析
- 歌曲簡譜國家成龍
- 設(shè)備安裝工程監(jiān)理規(guī)劃
- 防止機(jī)組非計(jì)劃停運(yùn)措施(鍋爐專業(yè))
- 素材的獲取與處理方法
- 如何同步同時(shí)接收老公老婆微信的實(shí)用教程
- 場調(diào)查報(bào)告封面
評論
0/150
提交評論