面向?qū)ο缶幊碳夹g(shù)第七章派生與繼承_第1頁
面向?qū)ο缶幊碳夹g(shù)第七章派生與繼承_第2頁
面向?qū)ο缶幊碳夹g(shù)第七章派生與繼承_第3頁
面向?qū)ο缶幊碳夹g(shù)第七章派生與繼承_第4頁
面向?qū)ο缶幊碳夹g(shù)第七章派生與繼承_第5頁
已閱讀5頁,還剩48頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

面向?qū)ο缶幊碳夹g(shù)第七章派生與繼承第一頁,共五十三頁,2022年,8月28日本章主要內(nèi)容類的繼承與派生的提出派生類的定義與相關(guān)概念三種基本繼承方式派生類的構(gòu)造與析構(gòu)函數(shù)派生類的成員標(biāo)示與訪問虛基類賦值兼容規(guī)則第二頁,共五十三頁,2022年,8月28日類的繼承與派生的提出問題:我會使用windows98,我需要重新學(xué)習(xí)XP操作系統(tǒng)嗎?我定義了一個描述點(diǎn)的類,如何在定義一個描述矩形的類??現(xiàn)實(shí)思維模式..WH事物發(fā)展有其延續(xù)性!第三頁,共五十三頁,2022年,8月28日類的繼承與派生的提出繼承的目的:實(shí)現(xiàn)數(shù)據(jù)、代碼的重用。派生的目的:當(dāng)新的問題出現(xiàn),原有程序無法解決(或不能完全解決)時(shí),需要對原有數(shù)據(jù)、代碼進(jìn)行改造。

返回第四頁,共五十三頁,2022年,8月28日派生類的定義與相關(guān)概念定義格式:class

派生類名:繼承方式1基類名1,…,繼承方式n基類名n{成員聲明;}

注:繼承方式公有繼承public私有繼承private保護(hù)繼承protected保持已有類的特性而構(gòu)造新類的過程稱為繼承。在已有類的基礎(chǔ)上新增自己的特性而產(chǎn)生新類的過程稱為派生。被繼承的已有類稱為基類(父類)。派生出的新類稱為派生類(子類)。直接父類、直接子類;間接父類、間接子類第五頁,共五十三頁,2022年,8月28日派生類的定義與相關(guān)概念派生(繼承)的內(nèi)部實(shí)現(xiàn)過程:添加新成員吸收除構(gòu)造、析構(gòu)函數(shù)外基類成員改造基類成員第六頁,共五十三頁,2022年,8月28日派生類的定義與相關(guān)概念描述平面的一個點(diǎn)矩形定義簡單實(shí)例:classpoint{public:point(inta,intb){x=a,y=b;}intgetx()…intgety()…voidmoveto(inta,intb)…private:intx,inty;}classrectangle:publicpoint{public:publicretangle(intx,inty,intwidth,intheigth):point(x,y){w=width;h=height;}privated:intw,h;}第七頁,共五十三頁,2022年,8月28日派生類的定義與相關(guān)概念基類與派生類的對應(yīng)關(guān)系:單繼承:派生類只從一個基類派生。多繼承:派生類從多個基類派生。多重派生:由一個基類派生出多個不同的派生類。多層派生:派生類又作為基類,繼續(xù)派生新的類。

第八頁,共五十三頁,2022年,8月28日簡化的繼承體系圖返回第九頁,共五十三頁,2022年,8月28日三種基本繼承方式1.公有繼承(public)基類的public和protected成員的訪問屬性在派生類中保持不變;基類的private成員不可訪問(類內(nèi))

派生類的對象只能訪問基類的public成員(類外)

第十頁,共五十三頁,2022年,8月28日classA{public:intx;A(inta,intb){x=a;u=b;}voidprt(){cout<<"publicx=:"<<x<<endl;}private:intu;};舉例第一步:定義基類:第十一頁,共五十三頁,2022年,8月28日舉例第二步:定義派生類classB:publicA{public:B(inta,intb,intc):A(a,b){y=c;}inty;voidprt(){cout<<"A::x=:"<<A::x<<endl; A::prt();

//cout<<"privatebaseA::u="<<A::u<<endl; cout<<"B::y=:"<<y<<endl; }};此行錯誤!第十二頁,共五十三頁,2022年,8月28日舉例第三步:使用派生類voidmain(){Bb(1,2,3);b.prt();//cout<<b.u<<endl;}運(yùn)行結(jié)果:A::x=:1publicx=:1B::y=:31PressanykeytocontinueError!不可直接輸出u.第十三頁,共五十三頁,2022年,8月28日派生類中:基類public和protected成員變成private成員;基類private成員不可訪問。通過派生類的對象不能訪問基類中的任何成員2.私有繼承(private)

如何理解?類外的問題第十四頁,共五十三頁,2022年,8月28日classA{public:intx;A(inta,intb){x=a;u=b;}voidprt(){cout<<"publicx=:"<<x<<endl;}private:intu;};舉例第一步:定義基類:第十五頁,共五十三頁,2022年,8月28日舉例第二步:定義派生類classB:privateA{public:B(inta,intb,intc):A(a,b){y=c;}inty;voidprt(){cout<<"A::x=:"<<A::x<<endl; A::prt(); cout<<"B::y=:"<<y<<endl; }};第十六頁,共五十三頁,2022年,8月28日舉例第三步:使用派生類voidmain(){Bb(1,2,3);b.prt();//cout<<b.x<<endl;}運(yùn)行結(jié)果:A::x=:1publicx=:1B::y=:31Pressanykeytocontinue私有數(shù)據(jù),不可直接輸出b.第十七頁,共五十三頁,2022年,8月28日3.保護(hù)繼承(public)派生類中:基類的public和protected成員變成protected成員;基類的private成員不可訪問派生類的對象不能訪問基類中的任何成員第十八頁,共五十三頁,2022年,8月28日protected成員舉例classA{protected:intx;}intmain(){Aa;//a.X=5;錯誤}第十九頁,共五十三頁,2022年,8月28日protected繼承classA{public:intxvoidshow_private(){cout<<"privateofA'sy="<<y;}voidshow_proteced(){cout<<"protectedofA'sz="<<z;}private:inty;protected:intz;};第二十頁,共五十三頁,2022年,8月28日classB:protectedA{public:voidout_base_public(){cout<<"x=:"<<x<<endl;}//voidout_base_private(){cout<<"y=:"<<y<<endl;}Error!voidout_base_proteced(){cout<<"z=:"<<z<<endl;}};voidmain(){Bb;//b.x=19;Errror//b.y=19;Error//b.z=19;Errorb.out_base_public();b.out_base_proteced();}如何訪問A中的X、y、z?如何輸出A中的私有成員?間接的方式第二十一頁,共五十三頁,2022年,8月28日三種繼承方式之間的比較返回第二十二頁,共五十三頁,2022年,8月28日派生類的構(gòu)造與析構(gòu)函數(shù)一、構(gòu)造函數(shù)基類的構(gòu)造函數(shù)不被繼承,需要在派生類中自行聲明初始化完成:基類成員:基類構(gòu)造函數(shù)完成內(nèi)嵌對象成員新增成員順序的思考:有它的現(xiàn)實(shí)原形么??第二十三頁,共五十三頁,2022年,8月28日格式:派生類名::派生類名(參數(shù)總表):基類名1(參數(shù)),基類名2(參數(shù)),...基類名n(參數(shù)),內(nèi)嵌對象1(參數(shù))…內(nèi)嵌對象n(參數(shù)){本類成員初始化賦值語句;};派生類的構(gòu)造函數(shù)注意:參數(shù)的順序不重要對比組合類的構(gòu)造函數(shù)第二十四頁,共五十三頁,2022年,8月28日構(gòu)造函數(shù)的調(diào)用次序調(diào)用基類構(gòu)造函數(shù),調(diào)用順序按照它們被繼承時(shí)聲明的順序(從左向右)。調(diào)用成員對象的構(gòu)造函數(shù),調(diào)用順序按照它們在類中聲明的順序。派生類的構(gòu)造函數(shù)完成新增成員的初始化。注意:派生類的析構(gòu)函數(shù)的調(diào)用次序與構(gòu)造函數(shù)正好相反為什么?第二十五頁,共五十三頁,2022年,8月28日舉例:討論構(gòu)造函數(shù)的調(diào)用次序問題classB1 //基類B1,構(gòu)造函數(shù)有參數(shù){public: B1(inti){cout<<"constructingB1"<<i<<endl;}};classB2 //基類B2,構(gòu)造函數(shù)有參數(shù){public: B2(intj){cout<<"constructingB2"<<j<<endl;}};classB3 //基類B3,構(gòu)造函數(shù)無參數(shù){public: B3(){cout<<"constructingB3*"<<endl;}};第二十六頁,共五十三頁,2022年,8月28日classC:publicB2,publicB1,publicB3{public: C(inta,intb,intc,intd):B1(a),memberB2(d),memberB1(c),B2(b){}private: B1memberB1; B2memberB2; B3memberB3;};voidmain(){Cobj(1,2,3,4);}認(rèn)真思考并回答其輸出結(jié)果?第二十七頁,共五十三頁,2022年,8月28日constructingB22constructingB11constructingB3*constructingB13constructingB24constructingB3*Pressanykeytocontinue第二十八頁,共五十三頁,2022年,8月28日對構(gòu)造函數(shù)調(diào)用的討論基類采用缺省構(gòu)造函數(shù)時(shí):派生類構(gòu)造函數(shù)可以調(diào)用基類缺省構(gòu)造函數(shù)?;惵暶鲙螀⒌臉?gòu)造函數(shù)時(shí),派生類傳遞參數(shù)給基類構(gòu)造函數(shù),完成基類成員的初始化自定義缺省構(gòu)造函數(shù):1.無參數(shù)2.帶缺省值系統(tǒng)默認(rèn)構(gòu)造函數(shù)兩種情形第二十九頁,共五十三頁,2022年,8月28日二、析構(gòu)函數(shù)析構(gòu)函數(shù)也不被繼承,派生類自行聲明聲明方法與一般(無繼承關(guān)系時(shí))類的析構(gòu)函數(shù)相同不需要顯式地調(diào)用基類的析構(gòu)函數(shù),系統(tǒng)會自動隱式調(diào)用和組合類相似第三十頁,共五十三頁,2022年,8月28日二、析構(gòu)函數(shù)析構(gòu)函數(shù)的調(diào)用次序與構(gòu)造函數(shù)相反自定義析構(gòu)函數(shù)主要完成動態(tài)分配內(nèi)存對象的釋放第三十一頁,共五十三頁,2022年,8月28日舉例:classB1 //基類B1聲明{public:B1(inti){cout<<"constructingB1"<<i<<endl;}~B1(){cout<<"destructingB1"<<endl;}};classB2 //基類B2聲明{public:B2(intj){cout<<"constructingB2"<<j<<endl;} ~B2(){cout<<"destructingB2"<<endl;} };第三十二頁,共五十三頁,2022年,8月28日classB3 //基類B3聲明{public:B3(){cout<<"constructingB3*"<<endl;}~B3(){cout<<"destructingB3"<<endl;} };classC:publicB2,publicB1,publicB3 {public:C(inta,intb,intc,intd):B1(a),memberB2(d),memberB1(c),B2(b){}private:B1memberB1;B2memberB2;B3memberB3;};第三十三頁,共五十三頁,2022年,8月28日voidmain(){ Cobj(1,2,3,4);}輸出結(jié)果:ConstuctingB22ConstuctingB11ConstuctingB3*ConstuctingB13ConstuctingB24ConstuctingB3*DestructingB3DestructingB2DestructingB1DestructingB3DestructingB1DestructingB2返回第三十四頁,共五十三頁,2022年,8月28日派生類的成員標(biāo)示與訪問

問題:1.當(dāng)派生類與基類中有相同成員時(shí),如何標(biāo)示與訪問不同類中定義的成員?第三十五頁,共五十三頁,2022年,8月28日舉例:classB1 {public: intnV; voidfun(){…}};classD1:publicB1 {public:intnV; voidfun(){}}如何訪問D1類中、對象中成員?看下頁第三十六頁,共五十三頁,2022年,8月28日派生類的成員標(biāo)示與訪問

-同名覆蓋原則當(dāng)派生類與基類中有相同成員時(shí):若未強(qiáng)行指名,則通過派生類對象使用的是派生類中的同名成員。如要通過派生類對象訪問基類中被覆蓋的同名成員,應(yīng)使用基類名限定。第三十七頁,共五十三頁,2022年,8月28日voidmain(){ D1d1; d1.nV=1;//對象名.成員名標(biāo)識,訪問D1類成員,同名覆蓋

d1.fun(); d1.B1::nV=2;//作用域分辨符標(biāo)識,訪問基類B1成員

d1.B1::fun(); }第三十八頁,共五十三頁,2022年,8月28日派生類的成員標(biāo)示與訪問

-消除二義性

2.當(dāng)多個直接基類中都從某一間接基類繼承共同成員時(shí)如何標(biāo)示和訪問?(參見下頁圖)問題:問題越來越復(fù)雜啦!看下頁第三十九頁,共五十三頁,2022年,8月28日ClassB0{Public:IntnvVoidfun(){…}}classB1:publicB0{public: intnV1; voidfun1(){…}};classB2:publicB0{public: intnV2; voidfun2(){…}};classD1:publicB1,publicB2 {public:intnV; voidfun*(){}}第四十頁,共五十三頁,2022年,8月28日派生類的成員標(biāo)示與訪問

-解決二義性問題通過直接基類,使用作用域運(yùn)算符來訪問不同類中的成員-參照上頁圖示

D1.B1::nv=1;D1.B2::nv=2;聲明虛基類(下節(jié)介紹)返回第四十一頁,共五十三頁,2022年,8月28日虛基類虛基類的引入:用于直接基類有共同基類的場合,防止多次初始化基類成員,實(shí)現(xiàn)維護(hù)一份拷貝聲明:繼承時(shí)以virtual修飾說明基類

例:classB1:virtualpublicB注意:在第一級繼承時(shí)就要將共同基類設(shè)計(jì)為虛基類。下頁舉例第四十二頁,共五十三頁,2022年,8月28日虛基類舉例:classB0 //聲明基類B0{public: //外部接口

intnV; voidfun(){cout<<"MemberofB0"<<endl;}};classB1:virtualpublicB0//B0為虛基類{public: //新增外部接口

intnV1;};classB2:virtualpublicB0//B0為虛基類派生B2類{public: //新增外部接口

intnV2;};第四十三頁,共五十三頁,2022年,8月28日classD1:publicB1,publicB2 //派生類D1聲明{public: //新增外部接口

intnVd; voidfund(){cout<<"MemberofD1"<<endl;}};存儲映象虛基類第四十四頁,共五十三頁,2022年,8月28日voidmain() //程序主函數(shù){D1d1; //聲明D1類對象d1 d1.nV=2; //使用直接基類數(shù)據(jù)成員

d1.fun();//使用直接基類函數(shù)成員}使之虛的思想第四十五頁,共五十三頁,2022年,8月28日虛基類及其派生類構(gòu)造函數(shù)建立對象的類稱為最遠(yuǎn)派生類虛基類成員由最遠(yuǎn)派生類構(gòu)造函數(shù)通過虛基類構(gòu)造函數(shù)進(jìn)行初始化第四十六頁,共五十三頁,2022年,8月28日虛基類及其派生類構(gòu)造函數(shù)派生類在構(gòu)造函數(shù)的成員初始化表中調(diào)用虛基類的構(gòu)造函數(shù)。否則調(diào)用該虛基類的缺省構(gòu)造函數(shù)C++保證最遠(yuǎn)(當(dāng)前)派生類的構(gòu)造函數(shù)調(diào)用虛基類的構(gòu)造函數(shù),忽略其它父類對虛基類構(gòu)造函數(shù)的調(diào)用避免多次構(gòu)造第四十七頁,共五十三頁,2022年,8月28日classB0 //聲明基類B0{public: //外部接口

B0(intn){nV=n;}intnV;voidfun(){…}};classB1:virtualpublicB0 {public: B1(inta):B0(a){} intnV1;};classB2:virtualpublicB0 {public: B2(inta):B0(a){} intnV2;};直接基類與間接基類定義第四十八頁,共五十三頁,2022年,8月28日classD1:publicB1,publicB2{public: D1(inta):B0(a),B1(a),B2(a){} intnVd; voidfund(){cout<<"MemberofD1"<<endl;}};voidmain() { D1d1(9); d1.nV=2; d1.fun();}派生類定義返回第四十九頁,共五十三頁,2022年,8月28日賦值兼容

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論