版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第四章派生類(lèi)與繼承(2)第四章派生類(lèi)與繼承(2)表4.1(1)基類(lèi)中的私有成員無(wú)論何種繼承方式,派生類(lèi)均不可直接訪(fǎng)問(wèn)(2)基類(lèi)中的共有成員根據(jù)繼承方式而改變(3)基類(lèi)中的保護(hù)成員共有/保護(hù)繼承時(shí)不變,私有繼承時(shí)改變4.1.3基類(lèi)成員在派生類(lèi)中的訪(fǎng)問(wèn)屬性表4.14.1.3基類(lèi)成員在派生類(lèi)中的訪(fǎng)問(wèn)屬性4.1.4派生類(lèi)對(duì)基類(lèi)成員的訪(fǎng)問(wèn)規(guī)則訪(fǎng)問(wèn)形式:內(nèi)部訪(fǎng)問(wèn)由派生類(lèi)新增成員對(duì)基類(lèi)繼承來(lái)的成員進(jìn)行訪(fǎng)問(wèn).對(duì)象訪(fǎng)問(wèn)在派生類(lèi)外部,通過(guò)派生類(lèi)對(duì)象對(duì)基類(lèi)繼承來(lái)的成員進(jìn)行訪(fǎng)問(wèn).4.1.4派生類(lèi)對(duì)基類(lèi)成員的訪(fǎng)問(wèn)規(guī)則訪(fǎng)問(wèn)形式:1.私有繼承的訪(fǎng)問(wèn)規(guī)則基類(lèi)的public和protected成員被繼承后,變成派生類(lèi)的私有成員.派生類(lèi)其他成員可直接訪(fǎng)問(wèn)(內(nèi)部可訪(fǎng)問(wèn))外部通過(guò)派生類(lèi)對(duì)象無(wú)法訪(fǎng)問(wèn)1.私有繼承的訪(fǎng)問(wèn)規(guī)則基類(lèi)的public和protec例:4.1private:Xpublic:setx(intx)showx()private:Ypublic:setxy(intn,intm)showxy()basederive私有派生voidshowxy(){cout<<x;cout<<y<<endl;}例:4.1private:Xprivate:Y例4.2protected:apublic:seta(intsa)showa()protected:bpublic:seta(intsa,intsb)showab()protected:cpublic:seta(intsa,intsb,intsc)showabc()basederive1derive2私有派生私有派生例4.2protected:aprotected:b1.私有繼承的訪(fǎng)問(wèn)規(guī)則表4.2內(nèi)部可訪(fǎng)問(wèn)基類(lèi)的public和protected成員外部對(duì)象對(duì)基類(lèi)成員均不能訪(fǎng)問(wèn)。1.私有繼承的訪(fǎng)問(wèn)規(guī)則表4.22.公有繼承的訪(fǎng)問(wèn)規(guī)則公有繼承基類(lèi)所有成員(不變)內(nèi)部可訪(fǎng)問(wèn):基類(lèi)的public和protected外部可訪(fǎng)問(wèn):基類(lèi)的public基類(lèi)的private內(nèi)外都不能直接訪(fǎng)問(wèn);2.公有繼承的訪(fǎng)問(wèn)規(guī)則公有繼承基類(lèi)所有成員(不變)例4.3private:xprotected:ypublic:setxy(…)showxy()private
:zpublic:setxyz(…)showxyz()basederive公有派生voidsetxyz(intm,intn,intj){setxy(m,n);Z=j;}voidshowxyz(){cout<<x<<endl;cout<<y<<endl;cout<<z<<endl;}例4.3private:xprivate:z2.公有繼承的訪(fǎng)問(wèn)規(guī)則表4.3內(nèi)部可訪(fǎng)問(wèn)基類(lèi)的public和protected成員外部對(duì)象可訪(fǎng)問(wèn):基類(lèi)的public基類(lèi)的private內(nèi)外都不能直接訪(fǎng)問(wèn);2.公有繼承的訪(fǎng)問(wèn)規(guī)則表4.33.保護(hù)繼承的訪(fǎng)問(wèn)規(guī)則基類(lèi)的public和protected成員,通過(guò)保護(hù)繼承作為派生類(lèi)中的protected成員基類(lèi)的private成員(不變),派生類(lèi)無(wú)論內(nèi)部還是外部均不可直接訪(fǎng)問(wèn)。3.保護(hù)繼承的訪(fǎng)問(wèn)規(guī)則基類(lèi)的public和protected例4.4private:xprotected:ypublic:zsetx(…)getx()basederive保護(hù)繼承private
:mprotected:npublic:psetall(…)show()voidsetall(….){
x=a;//setx(a);y=b;z=c;…..}例4.4private:xbase3.保護(hù)繼承的訪(fǎng)問(wèn)規(guī)則表4.4內(nèi)部可訪(fǎng)問(wèn):基類(lèi)的public和protected成員外部對(duì)象均不可直接訪(fǎng)問(wèn)基類(lèi)成員。3.保護(hù)繼承的訪(fǎng)問(wèn)規(guī)則表4.44.2派生類(lèi)的構(gòu)造函數(shù)和析構(gòu)函數(shù)基類(lèi)都有顯式或隱式的構(gòu)造函數(shù)和析構(gòu)函數(shù)當(dāng)創(chuàng)建一個(gè)派生類(lèi)對(duì)象時(shí),如何調(diào)用基類(lèi)的構(gòu)造函數(shù)對(duì)基類(lèi)數(shù)據(jù)初始化,以及在撤消派生類(lèi)對(duì)象時(shí),又如何調(diào)用基類(lèi)的析構(gòu)函數(shù)來(lái)對(duì)基類(lèi)對(duì)象的數(shù)據(jù)成員進(jìn)行善后處理?第四章派生類(lèi)與繼承課件24.2.1派生類(lèi)構(gòu)造函數(shù)和析構(gòu)函數(shù)的執(zhí)行順序
通常情況下,當(dāng)創(chuàng)建派生類(lèi)對(duì)象時(shí):當(dāng)撤消派生類(lèi)對(duì)象時(shí),順序相反執(zhí)行基類(lèi)的構(gòu)造函數(shù)執(zhí)行派生類(lèi)的構(gòu)造函數(shù)執(zhí)行派生類(lèi)的析構(gòu)函數(shù)執(zhí)行基類(lèi)的析構(gòu)函數(shù)執(zhí)行基類(lèi)的構(gòu)造函數(shù)執(zhí)行派生類(lèi)的構(gòu)造函數(shù)執(zhí)行派生類(lèi)的析構(gòu)函數(shù)執(zhí)第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件24.2.2派生類(lèi)構(gòu)造函數(shù)和析構(gòu)函數(shù)的構(gòu)造規(guī)則
當(dāng)基類(lèi)的構(gòu)造函數(shù)沒(méi)有參數(shù),或沒(méi)有顯式定義構(gòu)造函數(shù)時(shí),派生類(lèi)可以不向基類(lèi)傳遞參數(shù),甚至可以不定義構(gòu)造函數(shù)。例4.5的程序就是由于基類(lèi)的構(gòu)造函數(shù)沒(méi)有參數(shù),所以派生類(lèi)沒(méi)有向基類(lèi)傳遞參數(shù)。派生類(lèi)不能繼承基類(lèi)中的構(gòu)造函數(shù)和析構(gòu)函數(shù)。當(dāng)基類(lèi)合有帶參數(shù)的構(gòu)造函數(shù)時(shí),派生類(lèi)必須定義構(gòu)造函數(shù).以提供把參數(shù)傳遞給基類(lèi)構(gòu)造函數(shù)的途徑。在C++中,派生類(lèi)構(gòu)造函數(shù)的一般格式為:
派生類(lèi)構(gòu)造函數(shù)名(參數(shù)表):基類(lèi)構(gòu)造函數(shù)名(參數(shù)表)4.2.2派生類(lèi)構(gòu)造函數(shù)和析構(gòu)函數(shù)的構(gòu)造規(guī)則第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2當(dāng)派生類(lèi)中含有對(duì)象成員時(shí),構(gòu)造函數(shù)的一般形式:派生類(lèi)構(gòu)造函數(shù)名(參數(shù)表):基類(lèi)構(gòu)造函數(shù)名(參數(shù)表)、對(duì)象成員名1(參數(shù)表),…、對(duì)象成員名n(參數(shù)表)在定義派生類(lèi)對(duì)象時(shí),構(gòu)造函數(shù)的執(zhí)行順序:基類(lèi)的構(gòu)造函數(shù)對(duì)象成員的構(gòu)造函數(shù)派生類(lèi)的構(gòu)造函數(shù)撤消對(duì)象時(shí),析構(gòu)函數(shù)的調(diào)用順序與構(gòu)造函數(shù)的調(diào)用順序正好相反。當(dāng)派生類(lèi)中含有對(duì)象成員時(shí),構(gòu)造函數(shù)的一般形式:第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2(1)當(dāng)基類(lèi)構(gòu)造函數(shù)不帶參數(shù)時(shí),派生類(lèi)不一定需要定義構(gòu)造函數(shù),然而當(dāng)基類(lèi)的構(gòu)造函數(shù)那怕只帶有一個(gè)參數(shù),它所有的派生類(lèi)都必須定義構(gòu)造函數(shù),甚至所定義的派生類(lèi)構(gòu)造函數(shù)的函數(shù)體可能為空,僅僅起參數(shù)的傳遞作用。derived(intn):base(n){j=0;}說(shuō)明(1)當(dāng)基類(lèi)構(gòu)造函數(shù)不帶參數(shù)時(shí),派生類(lèi)不一定需要定義構(gòu)造函數(shù)說(shuō)明(2)若基類(lèi)使用缺省構(gòu)造函數(shù)或不帶參數(shù)的構(gòu)造函數(shù),則在派生類(lèi)中定義構(gòu)造函數(shù)時(shí)可略去“:基類(lèi)構(gòu)造函數(shù)名(參數(shù)表)”;此時(shí)若派生類(lèi)也不需要構(gòu)造函數(shù),則可不定義構(gòu)造函數(shù)。說(shuō)明(2)若基類(lèi)使用缺省構(gòu)造函數(shù)或不帶參數(shù)的構(gòu)造函數(shù),則在派(3)如果派生類(lèi)的基類(lèi)也是一個(gè)派生類(lèi),則每個(gè)派生類(lèi)只需負(fù)責(zé)其直接基類(lèi)的構(gòu)造,依次上溯。(4)由于析構(gòu)函數(shù)是不帶參數(shù)的,在派生類(lèi)中是否要定義析構(gòu)函數(shù)與它所屬的基類(lèi)無(wú)關(guān),故基類(lèi)的析構(gòu)函數(shù)不會(huì)因?yàn)榕缮?lèi)沒(méi)有析構(gòu)函數(shù)而得不到執(zhí)行,它們各自是獨(dú)立的。(3)如果派生類(lèi)的基類(lèi)也是一個(gè)派生類(lèi),則每個(gè)派生類(lèi)只需負(fù)責(zé)其例題4.8Third(){e=0;}Third(intx,inty,intz):Second(x,y){e=z;}Second():First(1,1){c=0;d=0}Second(intx,inty):First(x+1,y+1){c=x;d=y}例題4.84.3調(diào)整基類(lèi)成員在派生類(lèi)中訪(fǎng)問(wèn)屬性的其他方法4.3.1同名成員
Yobj; obj.f();
obj.x::f();在私有繼承情況下,為了保證基類(lèi)的一部分成員函數(shù)在派生類(lèi)中也存在,必須在派生類(lèi)中重新定義同名的成員。4.3調(diào)整基類(lèi)成員在派生類(lèi)中訪(fǎng)問(wèn)屬性的其他方法4.3.14.3.2訪(fǎng)問(wèn)聲明例題4.10(提出問(wèn)題)C++提供訪(fǎng)問(wèn)聲明的特殊機(jī)制,可個(gè)別調(diào)整基類(lèi)的某些成員,使之在派生類(lèi)中保持原來(lái)的訪(fǎng)問(wèn)屬性。在派生類(lèi)定義中加入訪(fǎng)問(wèn)聲明:基類(lèi)名::成員名;例題:4.11(解決問(wèn)題)4.3.2訪(fǎng)問(wèn)聲明例題4.10(提出問(wèn)題)說(shuō)明(1)數(shù)據(jù)成員也可以使用訪(fǎng)問(wèn)聲明(2)訪(fǎng)問(wèn)聲明不帶類(lèi)型和參數(shù)(3)基類(lèi)私有成員不能使用訪(fǎng)問(wèn)聲明(4)對(duì)于基類(lèi)中重載函數(shù)名,訪(fǎng)問(wèn)聲明對(duì)所有的同名函數(shù)都起作用。(慎重)說(shuō)明(1)數(shù)據(jù)成員也可以使用訪(fǎng)問(wèn)聲明
前面我們介紹的派生類(lèi)只有一個(gè)基類(lèi),這種派生方法稱(chēng)為單基派生或單一繼承。當(dāng)一個(gè)派生類(lèi)具有多個(gè)基類(lèi)時(shí),這種派生方法稱(chēng)為多基派生或多重繼承。例如,用戶(hù)界面所提供的窗口、滾動(dòng)條、文本框以及多種類(lèi)型的按鈕,所有這些組件都是通過(guò)類(lèi)來(lái)支持的,若把這些類(lèi)中的兩個(gè)類(lèi)或多個(gè)類(lèi)合并,則可產(chǎn)生一個(gè)新類(lèi),例如把窗口和滾動(dòng)條合并起來(lái)產(chǎn)生一個(gè)可滾動(dòng)的窗口,這個(gè)可滾動(dòng)的窗口就是由多重繼承得來(lái)的。4.4多重繼承 前面我們介紹的派生類(lèi)只有一個(gè)基類(lèi),這種派生方法稱(chēng)為
在c++中,聲明具有兩個(gè)以上基類(lèi)的派生類(lèi)與聲明單基派生類(lèi)的形式相似,只需將要繼承的多個(gè)基類(lèi)用逗號(hào)分隔即可,其聲明的一般形式如下:4.3.1多重繼承的聲明在c++中,聲明具有兩個(gè)以上基類(lèi)的派生類(lèi)與聲明單基派第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2
說(shuō)明
對(duì)基類(lèi)成員的訪(fǎng)問(wèn)必須是:
無(wú)二義的,必須想法消除二義性。說(shuō)明
main(){
Zobj;
obj.f();}main()
假如定義類(lèi)Z的對(duì)象obj,
zobj;則以下對(duì)函數(shù)f()的訪(fǎng)問(wèn)是二義的:
obj.f();二義性錯(cuò)誤,不知調(diào)用的是類(lèi)x的f(),還是類(lèi)Y的f()使用成員名限定可以消除二義性,例如:
obj.X::f();調(diào)用類(lèi)x的f()obj.Y::f();調(diào)月類(lèi)Y的f()假如定義類(lèi)Z的對(duì)象obj,
多重繼承構(gòu)造函數(shù)的定義形式與單繼承構(gòu)造函數(shù)約定義形式相似,只是n個(gè)基類(lèi)的構(gòu)造函數(shù)之間用“,”分隔。多重繼承構(gòu)造函數(shù)定義的一般形式如下:
派生類(lèi)構(gòu)造函數(shù)名(參數(shù)表):基類(lèi)l構(gòu)造函數(shù)名(參數(shù)表),基類(lèi)2構(gòu)造函數(shù)名(參數(shù)表),…,基類(lèi)n構(gòu)造函數(shù)名(參數(shù)表){//……….}4.3.2多重繼承的構(gòu)造函數(shù)與析構(gòu)函數(shù)多重繼承構(gòu)造函數(shù)的定義形式與單繼承構(gòu)造函數(shù)約定義形式第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2
多重繼承的構(gòu)造函數(shù)的執(zhí)行順序與單繼承構(gòu)造函數(shù)的執(zhí)行順序相同:
先執(zhí)行基類(lèi)的構(gòu)造函數(shù)
再執(zhí)行對(duì)象成員的構(gòu)造函數(shù),
最后執(zhí)行派生類(lèi)構(gòu)造函數(shù)。在多個(gè)基類(lèi)之間,則嚴(yán)格按照派生類(lèi)聲明時(shí)從左到右的順序來(lái)排列先后。而析構(gòu)函數(shù)的執(zhí)行順序則剛好與構(gòu)造函數(shù)的執(zhí)行順序相反。構(gòu)造/析構(gòu)函數(shù)執(zhí)行順序 多重繼承的構(gòu)造函數(shù)的執(zhí)行順序與單繼承構(gòu)造函數(shù)的1.為什么要引入虛基類(lèi)
當(dāng)引用派生類(lèi)的成員時(shí),首先在派生類(lèi)自身的作用域中尋找這個(gè)成員,如果沒(méi)有找到.則到它的基類(lèi)中尋找。如果一個(gè)派生類(lèi)是從多個(gè)基類(lèi)派生出來(lái)的,而這些基類(lèi)又有一個(gè)共同的基類(lèi),則在這個(gè)派生類(lèi)中訪(fǎng)問(wèn)這個(gè)共同的基類(lèi)中的成員時(shí),可能會(huì)產(chǎn)生二義性。請(qǐng)看以下這段程序。虛基類(lèi)1.為什么要引入虛基類(lèi)虛基類(lèi)protected:apublic:base(…)public:base1(…){cout<<a;}PublicBaseBase1public:base2(…){cout<<a;}PublicBase2Derivedpublic:derived(…){cout<<a;}PublicPublicprotected:aPublicBaseBase1Pu
上述程序中,類(lèi)base是一個(gè)基類(lèi),從類(lèi)base派生出類(lèi)base1和類(lèi)base2,這是兩個(gè)單一繼承;從類(lèi)base1和類(lèi)base2共同派生出類(lèi)derived,這是一個(gè)多重繼承。這是一個(gè)存在問(wèn)題的程序,問(wèn)題出在派生類(lèi)derived的構(gòu)造函數(shù)的定義上,它試圖輸出一個(gè)它有權(quán)訪(fǎng)問(wèn)的變量a,表面上看來(lái)這是合理的,但實(shí)際上它對(duì)a的訪(fǎng)問(wèn)存在二義性.即函數(shù)中的變量a的值可能是從basel的派生路徑上來(lái)的,也有可能是從類(lèi)base2的派生路徑上來(lái)的,這里沒(méi)有明確的說(shuō)明。上述程序中,類(lèi)base是一個(gè)基類(lèi),從類(lèi)ba
雖然base1和base2是認(rèn)同一個(gè)基類(lèi)base派生而來(lái)的,但它們所對(duì)應(yīng)的是基類(lèi)base的不同拷貝。類(lèi)derived是base1和base2的派生類(lèi),因此類(lèi)base是類(lèi)derived的間接基類(lèi),它有兩個(gè)拷貝與類(lèi)derived相對(duì)應(yīng),一個(gè)是basel派生路徑上的拷貝,另一個(gè)是base2派生路徑上的拷貝。當(dāng)類(lèi)derived要訪(fǎng)問(wèn)這個(gè)間接基類(lèi)base時(shí).必須指定要訪(fǎng)問(wèn)的是哪個(gè)路徑上的base拷貝。這個(gè)例子中類(lèi)之間的層次關(guān)系如圖4.2所示。雖然base1和base2是認(rèn)同一個(gè)基類(lèi)base派第四章派生類(lèi)與繼承課件2
不難理解,如果在上例中類(lèi)base只存在一個(gè)拷貝,那么對(duì)a的引用就不會(huì)產(chǎn)生二義性。在c++中,如果想使這個(gè)公共的基類(lèi)只產(chǎn)生一個(gè)拷貝,則可以將這個(gè)基類(lèi)說(shuō)明為虛基類(lèi)。這就要求從類(lèi)base派生新類(lèi)時(shí),使用關(guān)鍵字virtual將類(lèi)base說(shuō)明為虛基類(lèi)。下面的例子中用根基類(lèi)重新定義例4.12中的類(lèi)。2.虛基類(lèi)的概念不難理解,如果在上例中類(lèi)base只存在一個(gè)拷貝,第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2
在上述程序中,從類(lèi)base派生出類(lèi)base1和類(lèi)base2時(shí),使用關(guān)鍵字virtual,把類(lèi)base聲明為base1和base2的虛基類(lèi)。這樣,從base1和base2派生出的類(lèi)derived只有一個(gè)基類(lèi)base,從而可以消除二義性。圖4.3就是本例采用應(yīng)基類(lèi)后的類(lèi)層次圖。 在上述程序中,從類(lèi)base派生出類(lèi)base1和類(lèi)base第四章派生類(lèi)與繼承課件2
虛基類(lèi)的初始化與一般的多重繼承的初始化在語(yǔ)法上是一樣的,但構(gòu)造函數(shù)的調(diào)用順序不同。虛基類(lèi)構(gòu)造函數(shù)的調(diào)用順序是這樣規(guī)定的: (1)若同一層次中包含多個(gè)虛基類(lèi),這些虛基類(lèi)的構(gòu)造函數(shù)按對(duì)它們說(shuō)明的先后次序調(diào)用。
3.虛基類(lèi)的初始化虛基類(lèi)的初始化與一般的多重繼承的初始化在語(yǔ)法上是一
(2)若虛基類(lèi)由非虛基類(lèi)派生而來(lái),則仍然先調(diào)用基類(lèi)構(gòu)造函數(shù).再調(diào)用派生類(lèi)的構(gòu)造函數(shù)。
(3)若同一層次中同時(shí)包含虛基類(lèi)和非虛基類(lèi),應(yīng)先調(diào)用虛基類(lèi)的構(gòu)造函數(shù),再調(diào)用非虛基類(lèi)的構(gòu)造函數(shù),最后調(diào)用派生類(lèi)構(gòu)造函數(shù)(2)若虛基類(lèi)由非虛基類(lèi)派生而來(lái),則仍然先調(diào)用基類(lèi)構(gòu)第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2
在上述程序中,base是一個(gè)虛基類(lèi),它只有一個(gè)帶參數(shù)的構(gòu)造函數(shù),因此要求在派生類(lèi)base1、base2和derived的構(gòu)造函數(shù)的初始化表中都必須帶有對(duì)base構(gòu)造函數(shù)的調(diào)用。
如果base不是虛基類(lèi),在派生類(lèi)derived的構(gòu)造函數(shù)的初始化表中調(diào)用base的構(gòu)造函數(shù)是錯(cuò)誤的,但是當(dāng)base是虛基類(lèi)且只有帶參數(shù)的構(gòu)造函數(shù)時(shí),就必須在類(lèi)derived的構(gòu)造函數(shù)的初始化表中調(diào)用類(lèi)base的構(gòu)造函數(shù)。因此,在derived構(gòu)造函數(shù)的初始比表中,不僅含有對(duì)basel和base2構(gòu)造函數(shù)的調(diào)用、還有對(duì)虛基類(lèi)base構(gòu)造函數(shù)的調(diào)用。 在上述程序中,base是一個(gè)虛基類(lèi),它只有一個(gè)帶參數(shù)的構(gòu)
不難看出,上述程序中虛基類(lèi)base的構(gòu)造函數(shù)只執(zhí)行了一次。顯然,當(dāng)derived的構(gòu)造函數(shù)調(diào)用了虛基類(lèi)base的構(gòu)造函數(shù)之后,類(lèi)basel和類(lèi)base2對(duì)base構(gòu)造函數(shù)的調(diào)用被忽略了。這也是初始化虛基類(lèi)和初始化非虛基類(lèi)不同的地方。不難看出,上述程序中虛基類(lèi)base的構(gòu)造函數(shù)只執(zhí)行說(shuō)明
(1)關(guān)鍵字virtual與派生方式關(guān)鍵字(public或private)的先后順序無(wú)關(guān)緊要,它只說(shuō)明是“虛擬派生”。例如以下兩個(gè)虛擬派生的聲明是等價(jià)的。說(shuō)明
(2)一個(gè)基類(lèi)在作為某些派生類(lèi)虛基類(lèi)的同時(shí).又作為另一些派生類(lèi)的非虛基類(lèi),這種情況是允許存在的,例如:(2)一個(gè)基類(lèi)在作為某些派生類(lèi)虛基類(lèi)的同時(shí).又作為另第四章派生類(lèi)與繼承課件2
此例的類(lèi)層次如圖4.4所示。此例中,派生類(lèi)AA由類(lèi)X、類(lèi)Y和類(lèi)z派生而來(lái)。AA與它的間接基類(lèi)B之間的對(duì)應(yīng)關(guān)系是;類(lèi)B既是x、Y繼承路徑上的一個(gè)虛基類(lèi),也是Z繼承路徑上酌一個(gè)非虛基類(lèi)。此例的類(lèi)層次如圖4.4所示。此例中,派生類(lèi)AA由類(lèi)X、類(lèi)4.5賦值兼容規(guī)則在需要基類(lèi)對(duì)象的任何地方都可以使用公有派生類(lèi)的對(duì)象來(lái)替代.(1)派生類(lèi)對(duì)象給基類(lèi)對(duì)象賦值(2)派生類(lèi)對(duì)象初始化基類(lèi)的引用(3)派生類(lèi)對(duì)象地址賦值給指向基類(lèi)的指針(4)派生類(lèi)對(duì)象指針賦值給指向基類(lèi)的指針4.5賦值兼容規(guī)則在需要基類(lèi)對(duì)象的任何地方都可以使用例4.17Baseb1(11);Derivedd1(22);b1=d1;Derivedd2(33);
Base&b2=d2;Derivedd3(44);Base*b3=&d3;Derived*d4=newDerived(55);Base*b4=d4;b4->show();deleted4;例4.17Baseb1(11);說(shuō)明(1)聲明為指向基類(lèi)對(duì)象的指針可指向其公有派生類(lèi)對(duì)象,不允許指向私有派生的對(duì)象。(2)聲明為指向派生類(lèi)對(duì)象的指針不能指向基類(lèi)的對(duì)象。(3)聲明為指向基類(lèi)對(duì)象的指針,當(dāng)其指向公有派生類(lèi)對(duì)象時(shí),只能直接訪(fǎng)問(wèn)派生類(lèi)中從基類(lèi)繼承來(lái)的成員說(shuō)明(1)聲明為指向基類(lèi)對(duì)象的指針可指向其公有派生類(lèi)對(duì)象,不將基類(lèi)指針顯式類(lèi)型轉(zhuǎn)換為派生類(lèi)指針。((B*)ptr)->print2(
);正確public:voidprint1(){}public:print2(){}PublicABA*ptr;ptr->print2();將基類(lèi)指針顯式類(lèi)型轉(zhuǎn)換為派生類(lèi)指針。PublicABA*4.6應(yīng)用舉例例4.18Data_recEmployeeStudentTeacherE_Strudent4.6應(yīng)用舉例例4.184.6應(yīng)用舉例例4.19locationpointcirclesXYshowhidemovetoshowhideexpand\contractmoveto4.6應(yīng)用舉例例4.19locationpointcirc第四章派生類(lèi)與繼承(2)第四章派生類(lèi)與繼承(2)表4.1(1)基類(lèi)中的私有成員無(wú)論何種繼承方式,派生類(lèi)均不可直接訪(fǎng)問(wèn)(2)基類(lèi)中的共有成員根據(jù)繼承方式而改變(3)基類(lèi)中的保護(hù)成員共有/保護(hù)繼承時(shí)不變,私有繼承時(shí)改變4.1.3基類(lèi)成員在派生類(lèi)中的訪(fǎng)問(wèn)屬性表4.14.1.3基類(lèi)成員在派生類(lèi)中的訪(fǎng)問(wèn)屬性4.1.4派生類(lèi)對(duì)基類(lèi)成員的訪(fǎng)問(wèn)規(guī)則訪(fǎng)問(wèn)形式:內(nèi)部訪(fǎng)問(wèn)由派生類(lèi)新增成員對(duì)基類(lèi)繼承來(lái)的成員進(jìn)行訪(fǎng)問(wèn).對(duì)象訪(fǎng)問(wèn)在派生類(lèi)外部,通過(guò)派生類(lèi)對(duì)象對(duì)基類(lèi)繼承來(lái)的成員進(jìn)行訪(fǎng)問(wèn).4.1.4派生類(lèi)對(duì)基類(lèi)成員的訪(fǎng)問(wèn)規(guī)則訪(fǎng)問(wèn)形式:1.私有繼承的訪(fǎng)問(wèn)規(guī)則基類(lèi)的public和protected成員被繼承后,變成派生類(lèi)的私有成員.派生類(lèi)其他成員可直接訪(fǎng)問(wèn)(內(nèi)部可訪(fǎng)問(wèn))外部通過(guò)派生類(lèi)對(duì)象無(wú)法訪(fǎng)問(wèn)1.私有繼承的訪(fǎng)問(wèn)規(guī)則基類(lèi)的public和protec例:4.1private:Xpublic:setx(intx)showx()private:Ypublic:setxy(intn,intm)showxy()basederive私有派生voidshowxy(){cout<<x;cout<<y<<endl;}例:4.1private:Xprivate:Y例4.2protected:apublic:seta(intsa)showa()protected:bpublic:seta(intsa,intsb)showab()protected:cpublic:seta(intsa,intsb,intsc)showabc()basederive1derive2私有派生私有派生例4.2protected:aprotected:b1.私有繼承的訪(fǎng)問(wèn)規(guī)則表4.2內(nèi)部可訪(fǎng)問(wèn)基類(lèi)的public和protected成員外部對(duì)象對(duì)基類(lèi)成員均不能訪(fǎng)問(wèn)。1.私有繼承的訪(fǎng)問(wèn)規(guī)則表4.22.公有繼承的訪(fǎng)問(wèn)規(guī)則公有繼承基類(lèi)所有成員(不變)內(nèi)部可訪(fǎng)問(wèn):基類(lèi)的public和protected外部可訪(fǎng)問(wèn):基類(lèi)的public基類(lèi)的private內(nèi)外都不能直接訪(fǎng)問(wèn);2.公有繼承的訪(fǎng)問(wèn)規(guī)則公有繼承基類(lèi)所有成員(不變)例4.3private:xprotected:ypublic:setxy(…)showxy()private
:zpublic:setxyz(…)showxyz()basederive公有派生voidsetxyz(intm,intn,intj){setxy(m,n);Z=j;}voidshowxyz(){cout<<x<<endl;cout<<y<<endl;cout<<z<<endl;}例4.3private:xprivate:z2.公有繼承的訪(fǎng)問(wèn)規(guī)則表4.3內(nèi)部可訪(fǎng)問(wèn)基類(lèi)的public和protected成員外部對(duì)象可訪(fǎng)問(wèn):基類(lèi)的public基類(lèi)的private內(nèi)外都不能直接訪(fǎng)問(wèn);2.公有繼承的訪(fǎng)問(wèn)規(guī)則表4.33.保護(hù)繼承的訪(fǎng)問(wèn)規(guī)則基類(lèi)的public和protected成員,通過(guò)保護(hù)繼承作為派生類(lèi)中的protected成員基類(lèi)的private成員(不變),派生類(lèi)無(wú)論內(nèi)部還是外部均不可直接訪(fǎng)問(wèn)。3.保護(hù)繼承的訪(fǎng)問(wèn)規(guī)則基類(lèi)的public和protected例4.4private:xprotected:ypublic:zsetx(…)getx()basederive保護(hù)繼承private
:mprotected:npublic:psetall(…)show()voidsetall(….){
x=a;//setx(a);y=b;z=c;…..}例4.4private:xbase3.保護(hù)繼承的訪(fǎng)問(wèn)規(guī)則表4.4內(nèi)部可訪(fǎng)問(wèn):基類(lèi)的public和protected成員外部對(duì)象均不可直接訪(fǎng)問(wèn)基類(lèi)成員。3.保護(hù)繼承的訪(fǎng)問(wèn)規(guī)則表4.44.2派生類(lèi)的構(gòu)造函數(shù)和析構(gòu)函數(shù)基類(lèi)都有顯式或隱式的構(gòu)造函數(shù)和析構(gòu)函數(shù)當(dāng)創(chuàng)建一個(gè)派生類(lèi)對(duì)象時(shí),如何調(diào)用基類(lèi)的構(gòu)造函數(shù)對(duì)基類(lèi)數(shù)據(jù)初始化,以及在撤消派生類(lèi)對(duì)象時(shí),又如何調(diào)用基類(lèi)的析構(gòu)函數(shù)來(lái)對(duì)基類(lèi)對(duì)象的數(shù)據(jù)成員進(jìn)行善后處理?第四章派生類(lèi)與繼承課件24.2.1派生類(lèi)構(gòu)造函數(shù)和析構(gòu)函數(shù)的執(zhí)行順序
通常情況下,當(dāng)創(chuàng)建派生類(lèi)對(duì)象時(shí):當(dāng)撤消派生類(lèi)對(duì)象時(shí),順序相反執(zhí)行基類(lèi)的構(gòu)造函數(shù)執(zhí)行派生類(lèi)的構(gòu)造函數(shù)執(zhí)行派生類(lèi)的析構(gòu)函數(shù)執(zhí)行基類(lèi)的析構(gòu)函數(shù)執(zhí)行基類(lèi)的構(gòu)造函數(shù)執(zhí)行派生類(lèi)的構(gòu)造函數(shù)執(zhí)行派生類(lèi)的析構(gòu)函數(shù)執(zhí)第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件24.2.2派生類(lèi)構(gòu)造函數(shù)和析構(gòu)函數(shù)的構(gòu)造規(guī)則
當(dāng)基類(lèi)的構(gòu)造函數(shù)沒(méi)有參數(shù),或沒(méi)有顯式定義構(gòu)造函數(shù)時(shí),派生類(lèi)可以不向基類(lèi)傳遞參數(shù),甚至可以不定義構(gòu)造函數(shù)。例4.5的程序就是由于基類(lèi)的構(gòu)造函數(shù)沒(méi)有參數(shù),所以派生類(lèi)沒(méi)有向基類(lèi)傳遞參數(shù)。派生類(lèi)不能繼承基類(lèi)中的構(gòu)造函數(shù)和析構(gòu)函數(shù)。當(dāng)基類(lèi)合有帶參數(shù)的構(gòu)造函數(shù)時(shí),派生類(lèi)必須定義構(gòu)造函數(shù).以提供把參數(shù)傳遞給基類(lèi)構(gòu)造函數(shù)的途徑。在C++中,派生類(lèi)構(gòu)造函數(shù)的一般格式為:
派生類(lèi)構(gòu)造函數(shù)名(參數(shù)表):基類(lèi)構(gòu)造函數(shù)名(參數(shù)表)4.2.2派生類(lèi)構(gòu)造函數(shù)和析構(gòu)函數(shù)的構(gòu)造規(guī)則第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2當(dāng)派生類(lèi)中含有對(duì)象成員時(shí),構(gòu)造函數(shù)的一般形式:派生類(lèi)構(gòu)造函數(shù)名(參數(shù)表):基類(lèi)構(gòu)造函數(shù)名(參數(shù)表)、對(duì)象成員名1(參數(shù)表),…、對(duì)象成員名n(參數(shù)表)在定義派生類(lèi)對(duì)象時(shí),構(gòu)造函數(shù)的執(zhí)行順序:基類(lèi)的構(gòu)造函數(shù)對(duì)象成員的構(gòu)造函數(shù)派生類(lèi)的構(gòu)造函數(shù)撤消對(duì)象時(shí),析構(gòu)函數(shù)的調(diào)用順序與構(gòu)造函數(shù)的調(diào)用順序正好相反。當(dāng)派生類(lèi)中含有對(duì)象成員時(shí),構(gòu)造函數(shù)的一般形式:第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2(1)當(dāng)基類(lèi)構(gòu)造函數(shù)不帶參數(shù)時(shí),派生類(lèi)不一定需要定義構(gòu)造函數(shù),然而當(dāng)基類(lèi)的構(gòu)造函數(shù)那怕只帶有一個(gè)參數(shù),它所有的派生類(lèi)都必須定義構(gòu)造函數(shù),甚至所定義的派生類(lèi)構(gòu)造函數(shù)的函數(shù)體可能為空,僅僅起參數(shù)的傳遞作用。derived(intn):base(n){j=0;}說(shuō)明(1)當(dāng)基類(lèi)構(gòu)造函數(shù)不帶參數(shù)時(shí),派生類(lèi)不一定需要定義構(gòu)造函數(shù)說(shuō)明(2)若基類(lèi)使用缺省構(gòu)造函數(shù)或不帶參數(shù)的構(gòu)造函數(shù),則在派生類(lèi)中定義構(gòu)造函數(shù)時(shí)可略去“:基類(lèi)構(gòu)造函數(shù)名(參數(shù)表)”;此時(shí)若派生類(lèi)也不需要構(gòu)造函數(shù),則可不定義構(gòu)造函數(shù)。說(shuō)明(2)若基類(lèi)使用缺省構(gòu)造函數(shù)或不帶參數(shù)的構(gòu)造函數(shù),則在派(3)如果派生類(lèi)的基類(lèi)也是一個(gè)派生類(lèi),則每個(gè)派生類(lèi)只需負(fù)責(zé)其直接基類(lèi)的構(gòu)造,依次上溯。(4)由于析構(gòu)函數(shù)是不帶參數(shù)的,在派生類(lèi)中是否要定義析構(gòu)函數(shù)與它所屬的基類(lèi)無(wú)關(guān),故基類(lèi)的析構(gòu)函數(shù)不會(huì)因?yàn)榕缮?lèi)沒(méi)有析構(gòu)函數(shù)而得不到執(zhí)行,它們各自是獨(dú)立的。(3)如果派生類(lèi)的基類(lèi)也是一個(gè)派生類(lèi),則每個(gè)派生類(lèi)只需負(fù)責(zé)其例題4.8Third(){e=0;}Third(intx,inty,intz):Second(x,y){e=z;}Second():First(1,1){c=0;d=0}Second(intx,inty):First(x+1,y+1){c=x;d=y}例題4.84.3調(diào)整基類(lèi)成員在派生類(lèi)中訪(fǎng)問(wèn)屬性的其他方法4.3.1同名成員
Yobj; obj.f();
obj.x::f();在私有繼承情況下,為了保證基類(lèi)的一部分成員函數(shù)在派生類(lèi)中也存在,必須在派生類(lèi)中重新定義同名的成員。4.3調(diào)整基類(lèi)成員在派生類(lèi)中訪(fǎng)問(wèn)屬性的其他方法4.3.14.3.2訪(fǎng)問(wèn)聲明例題4.10(提出問(wèn)題)C++提供訪(fǎng)問(wèn)聲明的特殊機(jī)制,可個(gè)別調(diào)整基類(lèi)的某些成員,使之在派生類(lèi)中保持原來(lái)的訪(fǎng)問(wèn)屬性。在派生類(lèi)定義中加入訪(fǎng)問(wèn)聲明:基類(lèi)名::成員名;例題:4.11(解決問(wèn)題)4.3.2訪(fǎng)問(wèn)聲明例題4.10(提出問(wèn)題)說(shuō)明(1)數(shù)據(jù)成員也可以使用訪(fǎng)問(wèn)聲明(2)訪(fǎng)問(wèn)聲明不帶類(lèi)型和參數(shù)(3)基類(lèi)私有成員不能使用訪(fǎng)問(wèn)聲明(4)對(duì)于基類(lèi)中重載函數(shù)名,訪(fǎng)問(wèn)聲明對(duì)所有的同名函數(shù)都起作用。(慎重)說(shuō)明(1)數(shù)據(jù)成員也可以使用訪(fǎng)問(wèn)聲明
前面我們介紹的派生類(lèi)只有一個(gè)基類(lèi),這種派生方法稱(chēng)為單基派生或單一繼承。當(dāng)一個(gè)派生類(lèi)具有多個(gè)基類(lèi)時(shí),這種派生方法稱(chēng)為多基派生或多重繼承。例如,用戶(hù)界面所提供的窗口、滾動(dòng)條、文本框以及多種類(lèi)型的按鈕,所有這些組件都是通過(guò)類(lèi)來(lái)支持的,若把這些類(lèi)中的兩個(gè)類(lèi)或多個(gè)類(lèi)合并,則可產(chǎn)生一個(gè)新類(lèi),例如把窗口和滾動(dòng)條合并起來(lái)產(chǎn)生一個(gè)可滾動(dòng)的窗口,這個(gè)可滾動(dòng)的窗口就是由多重繼承得來(lái)的。4.4多重繼承 前面我們介紹的派生類(lèi)只有一個(gè)基類(lèi),這種派生方法稱(chēng)為
在c++中,聲明具有兩個(gè)以上基類(lèi)的派生類(lèi)與聲明單基派生類(lèi)的形式相似,只需將要繼承的多個(gè)基類(lèi)用逗號(hào)分隔即可,其聲明的一般形式如下:4.3.1多重繼承的聲明在c++中,聲明具有兩個(gè)以上基類(lèi)的派生類(lèi)與聲明單基派第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2
說(shuō)明
對(duì)基類(lèi)成員的訪(fǎng)問(wèn)必須是:
無(wú)二義的,必須想法消除二義性。說(shuō)明
main(){
Zobj;
obj.f();}main()
假如定義類(lèi)Z的對(duì)象obj,
zobj;則以下對(duì)函數(shù)f()的訪(fǎng)問(wèn)是二義的:
obj.f();二義性錯(cuò)誤,不知調(diào)用的是類(lèi)x的f(),還是類(lèi)Y的f()使用成員名限定可以消除二義性,例如:
obj.X::f();調(diào)用類(lèi)x的f()obj.Y::f();調(diào)月類(lèi)Y的f()假如定義類(lèi)Z的對(duì)象obj,
多重繼承構(gòu)造函數(shù)的定義形式與單繼承構(gòu)造函數(shù)約定義形式相似,只是n個(gè)基類(lèi)的構(gòu)造函數(shù)之間用“,”分隔。多重繼承構(gòu)造函數(shù)定義的一般形式如下:
派生類(lèi)構(gòu)造函數(shù)名(參數(shù)表):基類(lèi)l構(gòu)造函數(shù)名(參數(shù)表),基類(lèi)2構(gòu)造函數(shù)名(參數(shù)表),…,基類(lèi)n構(gòu)造函數(shù)名(參數(shù)表){//……….}4.3.2多重繼承的構(gòu)造函數(shù)與析構(gòu)函數(shù)多重繼承構(gòu)造函數(shù)的定義形式與單繼承構(gòu)造函數(shù)約定義形式第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2
多重繼承的構(gòu)造函數(shù)的執(zhí)行順序與單繼承構(gòu)造函數(shù)的執(zhí)行順序相同:
先執(zhí)行基類(lèi)的構(gòu)造函數(shù)
再執(zhí)行對(duì)象成員的構(gòu)造函數(shù),
最后執(zhí)行派生類(lèi)構(gòu)造函數(shù)。在多個(gè)基類(lèi)之間,則嚴(yán)格按照派生類(lèi)聲明時(shí)從左到右的順序來(lái)排列先后。而析構(gòu)函數(shù)的執(zhí)行順序則剛好與構(gòu)造函數(shù)的執(zhí)行順序相反。構(gòu)造/析構(gòu)函數(shù)執(zhí)行順序 多重繼承的構(gòu)造函數(shù)的執(zhí)行順序與單繼承構(gòu)造函數(shù)的1.為什么要引入虛基類(lèi)
當(dāng)引用派生類(lèi)的成員時(shí),首先在派生類(lèi)自身的作用域中尋找這個(gè)成員,如果沒(méi)有找到.則到它的基類(lèi)中尋找。如果一個(gè)派生類(lèi)是從多個(gè)基類(lèi)派生出來(lái)的,而這些基類(lèi)又有一個(gè)共同的基類(lèi),則在這個(gè)派生類(lèi)中訪(fǎng)問(wèn)這個(gè)共同的基類(lèi)中的成員時(shí),可能會(huì)產(chǎn)生二義性。請(qǐng)看以下這段程序。虛基類(lèi)1.為什么要引入虛基類(lèi)虛基類(lèi)protected:apublic:base(…)public:base1(…){cout<<a;}PublicBaseBase1public:base2(…){cout<<a;}PublicBase2Derivedpublic:derived(…){cout<<a;}PublicPublicprotected:aPublicBaseBase1Pu
上述程序中,類(lèi)base是一個(gè)基類(lèi),從類(lèi)base派生出類(lèi)base1和類(lèi)base2,這是兩個(gè)單一繼承;從類(lèi)base1和類(lèi)base2共同派生出類(lèi)derived,這是一個(gè)多重繼承。這是一個(gè)存在問(wèn)題的程序,問(wèn)題出在派生類(lèi)derived的構(gòu)造函數(shù)的定義上,它試圖輸出一個(gè)它有權(quán)訪(fǎng)問(wèn)的變量a,表面上看來(lái)這是合理的,但實(shí)際上它對(duì)a的訪(fǎng)問(wèn)存在二義性.即函數(shù)中的變量a的值可能是從basel的派生路徑上來(lái)的,也有可能是從類(lèi)base2的派生路徑上來(lái)的,這里沒(méi)有明確的說(shuō)明。上述程序中,類(lèi)base是一個(gè)基類(lèi),從類(lèi)ba
雖然base1和base2是認(rèn)同一個(gè)基類(lèi)base派生而來(lái)的,但它們所對(duì)應(yīng)的是基類(lèi)base的不同拷貝。類(lèi)derived是base1和base2的派生類(lèi),因此類(lèi)base是類(lèi)derived的間接基類(lèi),它有兩個(gè)拷貝與類(lèi)derived相對(duì)應(yīng),一個(gè)是basel派生路徑上的拷貝,另一個(gè)是base2派生路徑上的拷貝。當(dāng)類(lèi)derived要訪(fǎng)問(wèn)這個(gè)間接基類(lèi)base時(shí).必須指定要訪(fǎng)問(wèn)的是哪個(gè)路徑上的base拷貝。這個(gè)例子中類(lèi)之間的層次關(guān)系如圖4.2所示。雖然base1和base2是認(rèn)同一個(gè)基類(lèi)base派第四章派生類(lèi)與繼承課件2
不難理解,如果在上例中類(lèi)base只存在一個(gè)拷貝,那么對(duì)a的引用就不會(huì)產(chǎn)生二義性。在c++中,如果想使這個(gè)公共的基類(lèi)只產(chǎn)生一個(gè)拷貝,則可以將這個(gè)基類(lèi)說(shuō)明為虛基類(lèi)。這就要求從類(lèi)base派生新類(lèi)時(shí),使用關(guān)鍵字virtual將類(lèi)base說(shuō)明為虛基類(lèi)。下面的例子中用根基類(lèi)重新定義例4.12中的類(lèi)。2.虛基類(lèi)的概念不難理解,如果在上例中類(lèi)base只存在一個(gè)拷貝,第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2
在上述程序中,從類(lèi)base派生出類(lèi)base1和類(lèi)base2時(shí),使用關(guān)鍵字virtual,把類(lèi)base聲明為base1和base2的虛基類(lèi)。這樣,從base1和base2派生出的類(lèi)derived只有一個(gè)基類(lèi)base,從而可以消除二義性。圖4.3就是本例采用應(yīng)基類(lèi)后的類(lèi)層次圖。 在上述程序中,從類(lèi)base派生出類(lèi)base1和類(lèi)base第四章派生類(lèi)與繼承課件2
虛基類(lèi)的初始化與一般的多重繼承的初始化在語(yǔ)法上是一樣的,但構(gòu)造函數(shù)的調(diào)用順序不同。虛基類(lèi)構(gòu)造函數(shù)的調(diào)用順序是這樣規(guī)定的: (1)若同一層次中包含多個(gè)虛基類(lèi),這些虛基類(lèi)的構(gòu)造函數(shù)按對(duì)它們說(shuō)明的先后次序調(diào)用。
3.虛基類(lèi)的初始化虛基類(lèi)的初始化與一般的多重繼承的初始化在語(yǔ)法上是一
(2)若虛基類(lèi)由非虛基類(lèi)派生而來(lái),則仍然先調(diào)用基類(lèi)構(gòu)造函數(shù).再調(diào)用派生類(lèi)的構(gòu)造函數(shù)。
(3)若同一層次中同時(shí)包含虛基類(lèi)和非虛基類(lèi),應(yīng)先調(diào)用虛基類(lèi)的構(gòu)造函數(shù),再調(diào)用非虛基類(lèi)的構(gòu)造函數(shù),最后調(diào)用派生類(lèi)構(gòu)造函數(shù)(2)若虛基類(lèi)由非虛基類(lèi)派生而來(lái),則仍然先調(diào)用基類(lèi)構(gòu)第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2第四章派生類(lèi)與繼承課件2
在上述
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度個(gè)人之間環(huán)??萍冀杩詈贤?guī)范書(shū)2篇
- 2025版贍養(yǎng)老人子女責(zé)任分擔(dān)及費(fèi)用分?jǐn)偤贤?篇
- 二零二五版消防系統(tǒng)安裝與消防設(shè)備檢測(cè)及維修合同3篇
- 二零二五年度企業(yè)園區(qū)物業(yè)管理合同范本正規(guī)范本3篇
- 二零二五年度行政合同簽訂與行政指導(dǎo)實(shí)施要點(diǎn)匯編3篇
- 二零二五版代付款委托合同范本(升級(jí)版)3篇
- 二零二五年度農(nóng)產(chǎn)品深加工投資合作協(xié)議書(shū)3篇
- 二零二五年度跨境電商進(jìn)口商品銷(xiāo)售訂單協(xié)議
- 排球場(chǎng)防滑地面施工方案
- 新密鋼結(jié)構(gòu)防腐施工方案
- 人教版小學(xué)數(shù)學(xué)(2024)一年級(jí)下冊(cè)第一單元 認(rèn)識(shí)平面圖形綜合素養(yǎng)測(cè)評(píng) B卷(含答案)
- 2025年國(guó)家公安部直屬事業(yè)單位招錄人民警察及工作人員696人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 企業(yè)年會(huì)攝影服務(wù)合同
- 二零二五年度一手房購(gòu)房協(xié)議書(shū)(共有產(chǎn)權(quán)房購(gòu)房協(xié)議)3篇
- 2024復(fù)工復(fù)產(chǎn)安全培訓(xùn)
- 城市公共交通運(yùn)營(yíng)協(xié)議
- 中學(xué)生宿舍日常與管理
- 移動(dòng)商務(wù)內(nèi)容運(yùn)營(yíng)(吳洪貴)任務(wù)六 結(jié)合熱度事件的內(nèi)容傳播
- 新人教版六年級(jí)下冊(cè)數(shù)學(xué)全冊(cè)課件
- 江蘇對(duì)口單招英語(yǔ)考綱詞匯總結(jié)
- (完整word版)手卡模板
評(píng)論
0/150
提交評(píng)論