程序設(shè)計教程:用C++語言編程 第4版 課件 8-1 多繼承_第1頁
程序設(shè)計教程:用C++語言編程 第4版 課件 8-1 多繼承_第2頁
程序設(shè)計教程:用C++語言編程 第4版 課件 8-1 多繼承_第3頁
程序設(shè)計教程:用C++語言編程 第4版 課件 8-1 多繼承_第4頁
程序設(shè)計教程:用C++語言編程 第4版 課件 8-1 多繼承_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

多繼承多繼承的需要性對于下面的兩個類A和B:classA{ intm; public: voidfa();};classB{ intn; public: voidfb();};如何定義一個類C,它包含A和B的所有成員,另外還擁有新的數(shù)據(jù)成員r和成員函數(shù)fc?用單繼承實現(xiàn)classC:publicA{ intn,r;//把B類中的n復(fù)制過來 public: voidfb();//把B類中的fb復(fù)制過來 voidfc();};或者classC:publicB{ intm,r;//把A類中的m復(fù)制過來 public: voidfa();//把A類中的fa復(fù)制過來 voidfc();};不足之處:概念混亂:導(dǎo)致A和B之間增加了層次關(guān)系。

易造成不一致:A中的m、fa(或B中的n、fb)與C中的m、fa(或n、fb)。不能完全實現(xiàn)子類型:只有A和B中某一類對象能被C類對象替代。用成員對象實現(xiàn)classC{ Aa; Bb; intr; public: voidfa(){a.fa();} voidfb(){b.fb();} voidfc();};不足之處:不能實現(xiàn)子類型:程序中需要A和B類對象的地方都不能用C類對象去替代。用多繼承實現(xiàn)classC:publicA,publicB{ intr; public: voidfc();};多繼承增強(qiáng)了語言的表達(dá)能力,它使得語言能夠自然、方便地描述問題領(lǐng)域中的存在于對象類之間的多繼承關(guān)系。多繼承是指派生類可以有一個以上的直接基類。多繼承的派生類定義格式為:class<派生類名>:

[<繼承方式>]<基類名1>, [<繼承方式>]<基類名2>,

…{ <成員說明表>};繼承方式及訪問控制的規(guī)定同單繼承。派生類擁有所有基類的所有成員?;惖穆暶鞔涡驔Q定:對基類數(shù)據(jù)成員的存儲安排。對基類構(gòu)造函數(shù)/析構(gòu)函數(shù)的調(diào)用次序多繼承的類定義classA{ intm; public: voidfa();};classB{ intn; public: voidfb();};classC:publicA,publicB{ intr; public: voidfc();};......Cc;c.fa();//OKc.fb();//OKc.fc();//OK

對象c的內(nèi)存空間布局是: c A::m B::n C::r構(gòu)造函數(shù)的執(zhí)行次序是:A()、B()、C()(A()和B()實際是在C()的成員初始化表中調(diào)用。)需要A類或B類對象的地方可以用C類對象去替代。把多繼承派生類對象的地址賦給基類的指針時將會自動進(jìn)行地址調(diào)整。例如,對于前面的三個類:Cc;A*pa=&c;

c.fa();-->A::fa(this);B*pb=&c;c.fb();-->B::fb(this);

cA::mB::nC::r通過pa只能訪問到A類和C類中的內(nèi)容,但不會訪問到B類中的內(nèi)容。同樣,通過pb只能訪問到B類和C類中的內(nèi)容,但不會訪問到A類中的內(nèi)容。(通過pa或pb訪問C類中的內(nèi)容一般要通過虛函數(shù)動態(tài)綁定來實現(xiàn))多繼承帶來的問題多繼承使得語言特征復(fù)雜化、加大了編譯程序的難度以及使得消息綁定復(fù)雜化等,從而給正確使用多繼承帶來困難。因此,有些面向?qū)ο笳Z言(如Smalltalk、Java等)放棄了多繼承機(jī)制。多繼承帶來的兩個主要問題:名沖突問題重復(fù)繼承問題多繼承中的名沖突問題classC:publicA,publicB{ ...... public: voidfunc() { f();//Error,是A的f,還是B的f?

}};......Cc;c.f();//Error,是A的f,還是B的f?classA{ ...... public: voidf(); voidg();};classB{ ...... public: voidf(); voidh();};解決名沖突的辦法是:基類名受限classC:publicA,publicB{ ...... public: voidfunc() { A::f();//OK,調(diào)用A的f。

B::f();//OK,調(diào)用B的f。

}};......Cc;c.A::f();//OK,調(diào)用A的f。c.B::f();//OK,調(diào)用B的f。重復(fù)繼承問題--虛基類下面的類D從類A繼承兩次,稱為重復(fù)繼承:classA{intx; ......};classB:publicA{......};classC:publicA{......};classD:publicB,publicC{......};Dd;上面D類的對象d將包含兩個x:B::x和C::xACDBAxx::B::xC::xd如果要求類D中只有一個x,則應(yīng)把A定義為B和C的虛基類:

classA{intx;......};classB:virtualpublicA{......};classC:virtualpublicA{......};classD:publicB,publicC{......};Dd;這樣,D類的對象d就只有一個x了。ACDB虛基類構(gòu)造函數(shù)的調(diào)用創(chuàng)建包含虛基類的類對象時:虛基類的構(gòu)造函數(shù)由該類的構(gòu)造函數(shù)直接調(diào)用。虛基類的構(gòu)造函數(shù)優(yōu)先非虛基類的構(gòu)造函數(shù)執(zhí)行。classA{intx;public:A(inti){x=i;}};classB:virtualpublicA//包含虛基類A{inty;public:B(inti):A(1){y=i;}};classC:virtualpublicA

//包含虛基類A{intz;public:C(inti):A(2){z=i;}};classD:publicB,publicC

//包含虛基類A{intm;public:D(inti,intj,intk):B(i),C(j),A(3){m=k;}};classE:publicD

//包含虛基類A{intn;public:E(inti,intj,intk,intl):D(i,j,k),A(4){n=l;}};......Dd(1,2,3);//這里,A的構(gòu)造函數(shù)由D調(diào)用,d.x初始化為3。調(diào)用的構(gòu)造函數(shù)及它們的執(zhí)行次序是:A(3)、B(1)、C(2)、D(1,2,3)Ee(1,2,3,4);//這里,A的構(gòu)造函數(shù)由E調(diào)用,e.x初始化為4。調(diào)用的構(gòu)造函數(shù)及它們的執(zhí)行次序是:A(4)、B(1)、C(2)、D(1,2,3)、E(1,2,3,4)虛基類的實現(xiàn)classA{intx;};classB:publicA{inty;voidfb(){x,y}//this->x,this->y};classC:publicA{intz;

voidfc(){x,z}//this->x,this->z};classD:publicB,publicC{intm;};Dd;x:y:x:z:m:非虛基類d.fb();d.fc();sizeof(d)==5*sizeof(int)!classA{intx;};classB:virtualpublicA{inty;

voidfb(){x,y}//this->x,this->y};classC:virtualpublicA{intz;

voidfc(){x,z}//this->x,this->z};classD:publicB,publicC{intm;};Dd;y:x:z:m:虛基類的一種實現(xiàn)

(簡單去掉一個x)

可行嗎?d.fb();訪問不到x!d.fc();classA{intx;};classB:virtualpublicA{inty;

voidfb(){x,y}//this->...x,this->y};classC:virtualpublicA{int

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論