程序設計課件-第4章繼承與組合_第1頁
程序設計課件-第4章繼承與組合_第2頁
程序設計課件-第4章繼承與組合_第3頁
程序設計課件-第4章繼承與組合_第4頁
程序設計課件-第4章繼承與組合_第5頁
免費預覽已結(jié)束,剩余127頁可下載查看

下載本文檔

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

文檔簡介

C++程序設第4章繼承與組第第4本章學習要1繼承與派生的概2派生類方3派生類的構(gòu)4派生類中基類成屬第第4本章學習要5派生類的構(gòu)造函數(shù)和析構(gòu)6多重繼7基類與派生類對象的關(guān)8組合——對象組成第4本章學習目 第4(softwarereusability。C++語言提供了第44.1第44.1第44.1派生類繼承了基類的所有數(shù)據(jù)成員和成員函數(shù)(第4學學小學中學大學留學初中初中高中??票究粕┦繄D4-1繼第4職(multipleinheritance),這種繼承關(guān)系所形成的結(jié)構(gòu)職經(jīng)銷經(jīng)銷工銷銷售經(jīng)圖4-2繼第4基類和派生類的關(guān)系,可以表述為派生類是基類的具體化,而基類是派生類的抽第4派生類 方單繼承派生類 格式如下class派生類名:[繼承方式]基類{派生類新增加}有的)、protected(受保護的)。此項是可選的,如第4class //voidsetx(intn){x=n;intgetx(){returnx;voidshowx(){cout<<"Baseclassx="<<x<<endl;} int第4 classDerived:publicBasevoidsety(intn){y=n;}intgety(){returny;}voidshowy(){cout<<"Derivedclass:y="<<y<<endl;}int第4派生類中的成員包括從基類繼承過來的成員和新增加的成員兩大部分,從基類繼承過來的成員體BaseintBaseintvoidsetx();intgetx();voidshowx();成員函

繼繼DerivedintDerivedintvoidsetx();intgetx();voidshowx();intvoidsety();intgety();voidshowy();圖4-3基類Base和派生類Derived的成員示意第44.3從基類接收成調(diào)整從基類接收的增加新成員第44.4派生類中基類成員 派生類中基類成員的屬性不僅與在類時所的屬性有關(guān),而且與在派生類時所指定的對基類的繼承方式有關(guān),這兩個因素共同決定基類成員在派生類中的屬性。第4 protected3種。不同的繼承方式?jīng)Q定了基類成員在 簡單地說(1)公用繼承(public第44.4派生類中基類成員 (2)私有繼承(private 第4 (3)受保護的繼承(protected

第4 derivedclass),其基類稱為公用基類(publicbase

第4表4-1公用基類成員在派生類中 屬公用基類的成在公用派生類中的屬私有成不公用成公保護成保第4【例4-1】公用繼承的#includeusingnamespacestd;classBase voidsetx(intn){x=n;intgetx(){returnx;voidshowx(){cout<<"x="<<x<<endl;} int第4 classDerived:publicBasevoidsety(intn){y=n;}intgety(){returny;}voidshowy(){cout<<"y="<<y<<endl;}voidset(intm,intn) setx(m);//在Derived中x}第4void //cout<<"x="<<x<<endl;}int第4int Derivedobj;return0;

程序運行結(jié)果如}

第4 (privatederivedclass),其基類稱為私有基類(privatebaseclass)。

第4表4-2私有基類成員在派生類中 屬私有基類的成在私有派生類中的屬私有成不公用成私保護成私第4【例4-24-1】中的公用繼承方式改為私有派生類如 classDerived:privateBasevoidsety(intn){y=n;}intgety(){returny;}voidshowy() 第4voidset(intm,int setx(m);//在Derived中x不可}void }int第4int Derivedreturn0;

程序運行結(jié)果如}第4 第4在定義一個派生類時將基類的繼承方式指protected的,稱為保護繼承(protectedderivedclass),其基類稱為受保護的基類(protectedbaseclass),簡稱保護基類。第44.4.3表4-3基類成員在派生類中 保護成

中 屬不保

中 屬不私

中 屬不保第44.4.3通過以上的介紹,可以知道(1)在派生類中,成員有4種不同 屬性①公用的:派生類內(nèi)和派生類外都可 ②受保護的:派生類內(nèi)可以 ③私有的:派生類內(nèi)可 ,派生類外不 ④不 的:派生類內(nèi)和派生類外都不 第4表4-4派生類中的成員 屬派生類中的成可可可可不可可可不可不可不可不可不可第44.4.3 第4【例4-3】保護繼承的例子#includeusingnamespacestd;classBase //voidsetx(intn){x=n;voidshowx(){cout<<"x="<<x<<endl;} intgetx(){returnx;} int第4 classDerived:protectedBasevoidsety(intn){y=n;}intgety(){returny;}voidshowy(){cout<<"y="<<y<<endl;}voidset(intm,intn){setx(m);//在Derived中x}第4void }int第4int Derivedreturn0;

程序運行結(jié)果如}第44.4.4派生類對基類成員的重定義 中一個與基類成員同名的成員,則派生類的新成員會與其同名的基類成員,使同名的基類成第4【例4-4】派生類重定義基類成員函數(shù)的例子#includeusingnamespacestd;classBase //voidset(intn){x=n;voidshow(){cout<<"Baseclassx="<<x<<endl;} int第4 classDerived:publicBasevoidset(inti,intj){m=i;n=j;}voidset(inti,intj,intk){ Base::set(i);}第4void cout<<"Derivedclass:m="<<m<<endl;cout<<"Derivedclass:n="<<n<<endl;}int第4intBaseclass:x=1Derivedclass:m=2Derivedclass:n=3Baseclass:x=10Derivedclassm=20Derivedclassn=30Baseclass:x=10 return0;}第44.4.4派生類對基類成員的重定義和名字隱從上例可以看出 第4【例4-5】派生類重定義基類數(shù)據(jù)成員的例子#includeusingnamespacestd;classBase floatvoidset(intn){x=n;voidshowcout<<"Baseclassx="<<x<<endl int第4 classDerived:publicBasevoidset(inti,intj,intk){Base::set(i);y=j; z=k;}voidshow(){cout<<"Baseclass:y="<<Base::y<<endl;cout<<"Derivedclass:y="<<y<<endl;cout<<"Derivedclass:z="<<z<<endl; int第4intint{Derivedreturn0;}Baseclass:x=1Baseclassy=12.3Derivedclassy=2Derivedclass第4 第4第44.5.1下面從最簡單的派生類構(gòu)造函數(shù)的定義第4【例4-6】簡單派生類的構(gòu)造函數(shù)usingnamespacestd;class 基類Base(intm,intnx=m;y=n; // //基類析構(gòu)函數(shù) intint第4classDerived:publicBase//公用派生類 Derived(intm,intn,intk):Base(m,n){z=k;void{cout<<"x="<<x<<endl;}~Derived(){} intz;第4intint{Derivedobj(12,34,56);obj.show();//輸出結(jié)果return0;}程序運行結(jié)果如第44.5.1Derived(intm,intn,intk):Base(m,圖4-4派生類Derived的構(gòu)造函數(shù)的參數(shù)傳第44.5.1定義簡單派生類構(gòu)造函數(shù)的一般形式為<派生類構(gòu)造函數(shù)名 數(shù)列表>):<基類構(gòu)造函數(shù)名參數(shù)表{<派生類新增數(shù)據(jù)成員初始化第44.5.1在建立一個對象時,執(zhí)行構(gòu)造函數(shù)的順序是第44.5.1在使用派生類構(gòu)造函數(shù)時,還有以下幾種情況第44.5.1classIndirectDerived:publicIndirectDerived(intm,intn,intDerived(m,n,k){w=p;void }int第44.5.1(2)當不需要對派生類新增的成員進行任何初始Derived(intm,intn,int第4派生類的需要決定采用哪式。第4承。在派生類時,可以根據(jù)需要定義自己的析(2)再調(diào)用基類的析構(gòu)函數(shù),對基類進行清理第4【例4-7】派生類的析usingnamespacestd;classBaseBase(){cout<<"Base~Base(){cout<<"Base第4classDerived:publicDerived(){cout<<"Derived~Derived(){cout<<"DerivedBaseConstructorDerivedConstructorDerivedDestructorBaseDestructorint Derivedobj;return0;}

第4多重繼承(multipleinheritance,MI)是指派生類具有兩個或兩個以上的直接基類(directclass)。第4多重繼承的方派生類的格式如下:class<派生類名繼承方式><基類名1>,…,<繼承{<派生類新增加成員其中不同的基類可以選擇不同的繼承方式第4多重繼承派生類的構(gòu)造函數(shù)與析構(gòu)函 數(shù)列表>):<基類名1>(<參數(shù)表{<派生類新增數(shù)據(jù)成員的初始化 第4多重繼承派生類的構(gòu)造函數(shù)與析構(gòu)函在建立一個派生類對象時,構(gòu)造函數(shù)調(diào)用順序為:先調(diào)用所有基類的構(gòu)造函數(shù),再執(zhí)行派生類構(gòu)造函數(shù)的函數(shù)體。所有基類構(gòu)造函數(shù)的調(diào)用順序?qū)凑账鼈冊诶^承方式中的次序調(diào)用,而不是按派生類構(gòu)造函數(shù)參數(shù)初始化列表中的次序調(diào)用。第4【例4-8】多重繼承派生類的構(gòu)造函數(shù)usingnamespacestd;class //Base1(intm,intn){x=m;y=n;}//基類構(gòu)造函數(shù)voidshow1() cout<<"x="<<x<<"y="<<y<<endl; intint第4class //Base2(inti,intj){u=i;v=j;} voidshow2() {cout<<"u="<<u<<"v="<<v<<endl;} intint第4classDerived:publicBase1,publicDerived(inta,intb,intc,intd,inte):Base1(a,b),voidshow cout<<"x="<<x<<"y="<<y;cout<<"u="<<u<<"v="<<v;cout<<"w="<<w<<endl;}intw;int{Derivedint{Derivedreturn0;}程程序運行結(jié)果如x=1y=2u=3第44.6.2多重繼承派生類的構(gòu)造函數(shù)與析構(gòu)函方式中的次序的逆序、從右到左調(diào)用。第44.6.3多重繼承引起的二義性問在多重繼承方式下,派生類繼承了多個基類的成員。如果在這多個基類中擁有同名的成員,那么,派生類在繼承各個基類的成員后,當調(diào)用派生類的這些同名成員時,由于成員標識符不唯一,出現(xiàn)二義性,編譯器無法確定到應該選擇派類中的哪一個成員,這種由于多重繼承而引起的對派生類的某個成員 出現(xiàn)不唯一的情況就稱為二義性問題第4多重繼承引起的二義性問二義性主要分為3種類型(1)兩個基類有同名成員(2)兩個基類和派生類三者都有同名成員(3)如果兩個基類Base1和Base2是從同一Base派生的第4(1)兩個基類有同名成usingnamespacestd;class 基類 //公用部intvoiddisplay(){cout<<"Base1::x="<<x<<endl;classBase2 基類 //公用部intvoiddisplay(){cout<<"Base2::x="<<x<<endl;第4classDerived:publicBase1,publicintvoidcout<<"Base1::x="<<//Base1::display();cout<<"Base2::x="<<Base2::x<<endl;//Base2::display()out<<"}第4intint{Derivedobj.display////錯return}第4多重繼承引起的二義性問編譯此程序,出現(xiàn)如下錯誤和警告提示errorC2385:'Derived::x'iswarningC4385:couldbethe'x'inbase'Base1'ofclasswarningC4385:orthe'x'inbase'Base2'ofclasserrorC2385:'Derived::display'iswarningC4385:couldbethe'display'inbase'Base1'classwarningC4385:orthe'display'inbase'Base2'ofclass第44.6.3多重繼承引起的二義性問 第44.6.3多重繼承引起的二義性問 cout<<"Base1::x="<<();第44.6.3多重繼承引起的二義性問(2)兩個基類和派生類三者都有同名成第4如將上面的Derived類改為classDerived:publicBase1,publicintvoiddisplaycout<<"Base1::x="<<//Base1::display();cout<<"Base2::x="<<Base2::x<<endl;//cout<<"}第44.6.3多重繼承引起的二義性問此時,如果在main函數(shù)中用派生類Derived定義一對象obj,并調(diào)用其數(shù)據(jù)成員x和成員函數(shù) //正確 派生類的x成 //正確 派生類的display()成 第44.6.3多重繼承引起的二義性問(3)如果兩個基類Base1和Base2是從同一Base派生class //intvoiddisplay(){cout<<"Base::x="<<x<<endl;第4classBase1:public //intclassBase2:publicBase //int第4classDerived:publicBase1,publicintvoidBase1::display//或者Base2::display();cout<<"Base1::y="<<y<<endl;cout<<"Base1::z="<<z<<endl;cout<<"Derived::w="<<w<<endl;}第4intintBase1::y;intBase2::x;intintintintBase1::y;intBase2::x;intintvoidBase1::display();voidBase2::display();voidshow();派生類Derived的數(shù)據(jù)成派生類Derived的成員函圖4-5間接派生類Derived中的成第4間接派生類Derived中的情況如圖4-5所示派生類派生類Derived新增成派生類Base2新增成基類Base的成派生類Base1新增成基類Base的成

圖4-5間接派生類Derived中的成第44.6.3多重繼承引起的二義性問如果在main函數(shù)中用派生類Derived定義一個對obj.x;obj.display();或obj.Base::x;應當通過類Base的直接派生類名 的Base的哪一個派生類中的基類成員。obj.Base1::x=3;第44.6.4虛基 C++提供了虛基類(virtualbaseclass)的方法,使4.6.4虛基

第4現(xiàn)在將上節(jié)的類 為虛基類,形式如下classclassBase1:virtualpublicclassBase2:virtualpublic4.6.4虛基

第4 派生類時,指定繼承方式 的。因為一 虛基類的一般形式為class派生類名virtual繼承方類第4Derivedintx;inty;intDerivedintx;inty;intvoidintvoidintvoidintvoidintintvoidint圖4-6虛擬繼承派生類Derived中的成

4.6.4虛基

第4需要注意:為了保證虛基類在派生類中只繼承一次 4.6.4虛基

第4AABCDE圖4-7重繼承與虛基第44.6.4虛基虛基類的初始第4【例4-9】虛基類的初始化usingnamespacestd;class 基類 //Base(intm,intn):x(m),y(n){} //基類構(gòu)造函數(shù) intx,第4classBase1:virtualpublicBase1(intm,intn,intk):Base(m,n){z1=k;}intclassBase2:virtualpublicBase2(intm,intn,intp):Base(m,n){z2=p;}int第4classDerived:publicBase1,publicDerived(intm,intn,into,intp,intq):Base(m,n),Base1(m,n,o),Base2(m,n,p){z=q;}voidshow }intz;int{Derivedint{Derivedobj(12,13,14,15,16);return}程序運行結(jié)果如虛基

第4派生類構(gòu)造函數(shù)調(diào)用的次序有3個原則 虛基

第4第4基類與派生類對象的關(guān)通過前面的學習可以發(fā)現(xiàn):3種繼承方式中,只有公 第4基類與派生類對象的關(guān)基類對象與公用派生類對象之間的賦值兼容關(guān)系具現(xiàn)在以下3個方面公用派生類對象可以向基類對象 第44.7基類與派生類對象的關(guān)公用派生類對象可以向基類對象賦Baseobj1(12,13);Derivedobj2(21,22,23);第44.7基類與派生類對象的關(guān)基基類數(shù)據(jù)成基類成員函派生基類數(shù)據(jù)成派生基類數(shù)據(jù)成基類成員函派生類數(shù)據(jù)成派生類成員函分舍去不圖4-8向基第44.7基類與派生類對象的關(guān)Baseobj1(12,13);Derivedobj2(21,22,23);Base&objref=obj1;Base&objref=obj2;或第44.7基類與派生類對象的關(guān) 部分的別名,objref與obj2中基類部分共享同一第44.7基類與派生類對象的關(guān)Obj2對Obj2對從基類繼承的部派生類新增加的部圖4-9派生類對基類對象 賦第44.7基類與派生類對象的關(guān)如果函數(shù)的參數(shù)是基類對象或基類對象 voidshow(Base&objref){cout<<objref.x<<endl;Derivedobj2(21,22,23);第44.7基類與派生類對象的關(guān)公用派生類對象的地址可以賦給指向基類對象指針變對象。但是通過指向基類對象的指針只能公用派生類對象中的基類成員,而不能公用派生類對象第4【例4-10】基類對象的指針指向公用派生類對象的usingnamespacestd;class

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論