多繼承時的構(gòu)造函數(shù)_第1頁
多繼承時的構(gòu)造函數(shù)_第2頁
多繼承時的構(gòu)造函數(shù)_第3頁
多繼承時的構(gòu)造函數(shù)_第4頁
多繼承時的構(gòu)造函數(shù)_第5頁
已閱讀5頁,還剩37頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、C+語言程序設(shè)計語言程序設(shè)計1多繼承時的構(gòu)造函數(shù)多繼承時的構(gòu)造函數(shù)派生類名派生類名:派生類名派生類名(基類基類1的形參的形參, 基類基類2的形參的形參, . , 基類基類n的形參的形參, 本類形參本類形參) : 基類名基類名1(基類基類1的形參的形參), 基類名基類名2(基類基類2的形參的形參), . , 基類名基類名n(基類基類n的形參的形參) 本類成員初始化賦值語句本類成員初始化賦值語句;多繼承時的構(gòu)造函數(shù)C+語言程序設(shè)計語言程序設(shè)計2派生類與基類的構(gòu)造函數(shù)派生類與基類的構(gòu)造函數(shù)n當(dāng)基類中聲明有默認(rèn)形式的構(gòu)造函數(shù)當(dāng)基類中聲明有默認(rèn)形式的構(gòu)造函數(shù)或未聲明構(gòu)造函數(shù)時,派生類構(gòu)造函或未聲明構(gòu)造函

2、數(shù)時,派生類構(gòu)造函數(shù)可以不向基類構(gòu)造函數(shù)傳遞參數(shù)。數(shù)可以不向基類構(gòu)造函數(shù)傳遞參數(shù)。n若基類中未聲明構(gòu)造函數(shù),派生類中若基類中未聲明構(gòu)造函數(shù),派生類中也可以不聲明,全采用缺省形式構(gòu)造也可以不聲明,全采用缺省形式構(gòu)造函數(shù)。函數(shù)。n當(dāng)基類聲明有帶形參的構(gòu)造函數(shù)時,當(dāng)基類聲明有帶形參的構(gòu)造函數(shù)時,派生類也應(yīng)聲明帶形參的構(gòu)造函數(shù),派生類也應(yīng)聲明帶形參的構(gòu)造函數(shù),并將參數(shù)傳遞給基類構(gòu)造函數(shù)。并將參數(shù)傳遞給基類構(gòu)造函數(shù)。多繼承時的構(gòu)造函數(shù)C+語言程序設(shè)計語言程序設(shè)計3多繼承且有內(nèi)嵌對象時的構(gòu)造函數(shù)多繼承且有內(nèi)嵌對象時的構(gòu)造函數(shù)派生類名派生類名:派生類名派生類名(基類基類1的形參的形參, 基類基類2的形參的形

3、參, . , 基類基類n的形參的形參, 本類形參本類形參) : 基類名基類名1(基類基類1的形參的形參), 基類名基類名2(基類基類2的形參的形參), . , 基類名基類名n(基類基類n的形參的形參), 對對象數(shù)據(jù)成員的初始化象數(shù)據(jù)成員的初始化 本類非對象數(shù)據(jù)成員的初始化語句本類非對象數(shù)據(jù)成員的初始化語句;多繼承時的構(gòu)造函數(shù)C+語言程序設(shè)計語言程序設(shè)計4構(gòu)造函數(shù)的調(diào)用次序構(gòu)造函數(shù)的調(diào)用次序1調(diào)用基類構(gòu)造函數(shù),調(diào)用順序按照它們調(diào)用基類構(gòu)造函數(shù),調(diào)用順序按照它們被繼承時聲明的順序(從左向右)。被繼承時聲明的順序(從左向右)。2調(diào)用成員對象的構(gòu)造函數(shù),調(diào)用順序按調(diào)用成員對象的構(gòu)造函數(shù),調(diào)用順序按照它

4、們在類中聲明的順序。照它們在類中聲明的順序。3派生類的構(gòu)造函數(shù)體中的內(nèi)容。派生類的構(gòu)造函數(shù)體中的內(nèi)容。多繼承時的構(gòu)造函數(shù)C+語言程序設(shè)計語言程序設(shè)計5拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)n若建立派生類對象時調(diào)用缺省拷貝構(gòu)造若建立派生類對象時調(diào)用缺省拷貝構(gòu)造函數(shù),則編譯器將自動調(diào)用基類的缺省函數(shù),則編譯器將自動調(diào)用基類的缺省拷貝構(gòu)造函數(shù)??截悩?gòu)造函數(shù)。n若編寫派生類的拷貝構(gòu)造函數(shù),則需要若編寫派生類的拷貝構(gòu)造函數(shù),則需要為基類相應(yīng)的拷貝構(gòu)造函數(shù)傳遞參數(shù)。為基類相應(yīng)的拷貝構(gòu)造函數(shù)傳遞參數(shù)。n例如例如:C:C(C &c1) : B(c1)多繼承時的構(gòu)造函數(shù)例例7-5 派生類構(gòu)造函數(shù)舉例派生類構(gòu)造函數(shù)舉例#inc

5、lude using namespace std;class B1 / 基類基類B1,構(gòu)造函數(shù)有參數(shù),構(gòu)造函數(shù)有參數(shù)public:B1(int i) cout constructing B1 i endl;class B2 / 基類基類B2,構(gòu)造函數(shù)有參數(shù),構(gòu)造函數(shù)有參數(shù)public:B2(int j) cout constructing B2 j endl; ;class B3 / 基類基類B3,構(gòu)造函數(shù)無參數(shù),構(gòu)造函數(shù)無參數(shù)public:B3( ) cout constructing B3 * endl; ;class C: public B2, public B1, public B3

6、public:/ 派生類的公有成員派生類的公有成員C(int a, int b, int c, int d): B1(a), mB2(d), mB1(c), B2(b) private:/ 派生類的私有對象成員派生類的私有對象成員B1 mB1;B2 mB2;B3 mB3;void main() C obj(1, 2, 3, 4); void main( ) C obj(1, 2, 3, 4);運行結(jié)果:運行結(jié)果:constructing B2 2constructing B1 1constructing B3 *constructing B1 3constructing B2 4constru

7、cting B3 *C+語言程序設(shè)計語言程序設(shè)計10繼承時的析構(gòu)函數(shù)繼承時的析構(gòu)函數(shù)n析構(gòu)函數(shù)也不被繼承,需在派生類中自析構(gòu)函數(shù)也不被繼承,需在派生類中自行聲明行聲明n聲明方法與一般(無繼承關(guān)系時)類的聲明方法與一般(無繼承關(guān)系時)類的析構(gòu)函數(shù)相同。析構(gòu)函數(shù)相同。n不需要顯式地調(diào)用基類的析構(gòu)函數(shù),系不需要顯式地調(diào)用基類的析構(gòu)函數(shù),系統(tǒng)會自動隱式調(diào)用。統(tǒng)會自動隱式調(diào)用。n析構(gòu)函數(shù)的調(diào)用次序與構(gòu)造函數(shù)嚴(yán)格相析構(gòu)函數(shù)的調(diào)用次序與構(gòu)造函數(shù)嚴(yán)格相反。反。多繼承時的析構(gòu)函數(shù)例例7-6 派生類析構(gòu)函數(shù)舉例派生類析構(gòu)函數(shù)舉例#include using namecpace std;class B1 / 基類基

8、類B1聲明聲明public:B1(int i) cout constructing B1 i endl; B1( ) cout destructing B1 endl; ;class B2 /基類基類B2聲明聲明public:B2(int j) cout constructing B2 j endl;B2( ) cout destructing B2 endl;class B3 / 基類基類B3聲明聲明public:B3( ) cout constructing B3 * endl;B3( ) cout destructing B3 endl;class C: public B2, publi

9、c B1, public B3 public:C(int a, int b, int c, int d): B1(a), mB2(d), mB1(c), B2(b) private:B1 mB1;B2 mB2;B3 mB3;void main( ) C obj(1, 2, 3, 4);constructing B2 2constructing B1 1constructing B3 *constructing B1 3constructing B2 4constructing B3 *destructing B3destructing B2destructing B1destructing B

10、3destructing B1destructing B2C+語言程序設(shè)計語言程序設(shè)計16同名隱藏規(guī)則同名隱藏規(guī)則n當(dāng)派生類與基類中有相同成員時:當(dāng)派生類與基類中有相同成員時:n若未強行指名,則通過派生類對象使用的是派若未強行指名,則通過派生類對象使用的是派生類中的同名成員。生類中的同名成員。n如要通過派生類對象訪問基類中被覆蓋的同名如要通過派生類對象訪問基類中被覆蓋的同名成員,應(yīng)使用基類名限定。成員,應(yīng)使用基類名限定。同名隱藏規(guī)則例例7-7 多繼承同名隱藏舉例多繼承同名隱藏舉例#include using namecpace std;class B1 / 聲明基類聲明基類B1public:/

11、外部接口外部接口int nV;void fun( ) cout Member of B1 endl;class B2 / 聲明基類聲明基類B2public:/ 外部接口外部接口int nV;void fun( ) cout Member of B2 endl;class D1: public B1, public B2 public:int nV; / 同名數(shù)據(jù)成員同名數(shù)據(jù)成員void fun( ) / 同名函數(shù)成員同名函數(shù)成員cout Member of D1 endl;void main( ) D1 d1;d1.nV = 1; / 訪問訪問D1類成員類成員d1.fun( );d1.B1:n

12、V = 2; / 訪問基類訪問基類B1成員成員d1.B1:fun( );d1.B2:nV = 3; / 訪問基類訪問基類B2成員成員d1.B2:fun( );C+語言程序設(shè)計語言程序設(shè)計21二義性問題二義性問題n在多繼承時,基類與派生類之間,或基在多繼承時,基類與派生類之間,或基類之間出現(xiàn)同名成員時,將出現(xiàn)訪問時類之間出現(xiàn)同名成員時,將出現(xiàn)訪問時的二義性(不確定性)的二義性(不確定性)采用虛函數(shù)采用虛函數(shù)(第(第8章)或同名隱藏規(guī)則來解決。章)或同名隱藏規(guī)則來解決。n當(dāng)派生類從多個基類派生,而這些基類當(dāng)派生類從多個基類派生,而這些基類又從同一個基類派生,則在訪問此共同又從同一個基類派生,則在訪

13、問此共同基類中的成員時,將產(chǎn)生二義性基類中的成員時,將產(chǎn)生二義性采采用虛基類來解決。用虛基類來解決。二義性問題二義性問題舉例(一)二義性問題舉例(一)class A public: void f( );class B public: void f( ); void g( );class C: public A, public B public: void g( ); void h( );如果聲明:如果聲明:C c1;則則c1.f( ); 具有二義性具有二義性(ambiguous)而而c1.g( ); 無二義性(同名覆蓋)無二義性(同名覆蓋)C+語言程序設(shè)計語言程序設(shè)計23二義性的解決方法二義性

14、的解決方法n解決方法一:用類名來限定解決方法一:用類名來限定c1.A:f( ) 或或 c1.B:f( )n解決方法二:同名覆蓋解決方法二:同名覆蓋n在類在類 C 中聲明一個同名成員函數(shù)中聲明一個同名成員函數(shù) f( ),f( ) 再再根據(jù)需要調(diào)用根據(jù)需要調(diào)用 A:f( ) 或或 B:f( )二義性問題二義性問題舉例(二)二義性問題舉例(二)class B public: int b;class B1 : public B private: int b1;class B2 : public B private: int b2;class C : public B1, public B2privat

15、e: int d;public: int f( );派生類派生類 C 的對象的存儲結(jié)構(gòu)示意圖:的對象的存儲結(jié)構(gòu)示意圖:bb1bb2dB類成員B類成員B1類成員B2類成員C類對象有二義性:有二義性:C c;c.bc.B:b:c.B1:bc.B2:b25C+語言程序設(shè)計語言程序設(shè)計26虛基類虛基類n虛基類的引入虛基類的引入用于有共同基類的場合用于有共同基類的場合n聲明聲明以以 virtual 修飾說明基類修飾說明基類例:例:class B1: virtual public B虛 基 類C+語言程序設(shè)計語言程序設(shè)計27虛基類虛基類n作用作用n主要用來解決多繼承時可能發(fā)生的對同一基類主要用來解決多繼承

16、時可能發(fā)生的對同一基類繼承多次而產(chǎn)生的二義性問題繼承多次而產(chǎn)生的二義性問題.n為最遠(yuǎn)的派生類提供唯一的基類成員,而不重為最遠(yuǎn)的派生類提供唯一的基類成員,而不重復(fù)產(chǎn)生多次拷貝復(fù)產(chǎn)生多次拷貝n注意:注意:在第一級繼承時就要將共同基類設(shè)計為虛基類。在第一級繼承時就要將共同基類設(shè)計為虛基類。虛 基 類虛基類舉例虛基類舉例class B public:int b;class B1 : virtual public B public:int b1;class B2 : virtual public B public:int b2;class C : public B1, public B2 public:

17、float d;下面的訪問是正確的:下面的訪問是正確的:C cobj;cobj.b = 3;BB1B2Cb1b2dB1類成員B2類成員C類對象bB類成員30虛基類的派生類對象存儲結(jié)構(gòu)示意圖:虛基類的派生類對象存儲結(jié)構(gòu)示意圖:C+語言程序設(shè)計語言程序設(shè)計31例例7-8 虛基類舉例虛基類舉例虛 基 類D1nV : int nVd: intB1:nV1 : intB2:nV2 : intfund( ) : voidfun( ) : voidB1nV1 : intB2nV2 : intD1nVd : intfund( ) : void B0nV : intfun( )B0B1新增成員B0B2新增成員D

18、1新增成員B0B0B1B2D1nV,fun( )32#include using namecpace std;class B0 / 聲明基類聲明基類B0public:/外部接口外部接口 int nV; void fun( ) cout Member of B0 endl; ;class B1 : virtual public B0 public:/ 新增外部接口新增外部接口 int nV1;class B2: virtual public B0 public:/ 新增外部接口新增外部接口 int nV2;class D1: public B1, public B2 public:/新增外部接口

19、新增外部接口int nVd;void fund( ) cout Member of D1 endl;void main( ) D1 d1;/ 聲明聲明 D1 類對象類對象 d1d1.nV = 2;/ 使用最遠(yuǎn)基類成員使用最遠(yuǎn)基類成員d1.fun( );C+語言程序設(shè)計語言程序設(shè)計36虛基類及其派生類構(gòu)造函數(shù)虛基類及其派生類構(gòu)造函數(shù)n建立對象時所指定的類稱為最(遠(yuǎn))派建立對象時所指定的類稱為最(遠(yuǎn))派生類。生類。n虛基類的數(shù)據(jù)成員是由最派生類的構(gòu)造虛基類的數(shù)據(jù)成員是由最派生類的構(gòu)造函數(shù)通過調(diào)用虛基類的構(gòu)造函數(shù)進(jìn)行初函數(shù)通過調(diào)用虛基類的構(gòu)造函數(shù)進(jìn)行初始化的。始化的。虛 基 類C+語言程序設(shè)計語言程

20、序設(shè)計37虛基類及其派生類構(gòu)造函數(shù)虛基類及其派生類構(gòu)造函數(shù)n在整個繼承結(jié)構(gòu)中,直接或間接繼承虛在整個繼承結(jié)構(gòu)中,直接或間接繼承虛基類的所有派生類,都必須在構(gòu)造函數(shù)基類的所有派生類,都必須在構(gòu)造函數(shù)的成員初始化表中給出對虛基類的構(gòu)造的成員初始化表中給出對虛基類的構(gòu)造函數(shù)的調(diào)用。如果未列出,則表示調(diào)用函數(shù)的調(diào)用。如果未列出,則表示調(diào)用該虛基類的缺省構(gòu)造函數(shù)。該虛基類的缺省構(gòu)造函數(shù)。n在建立對象時,只有最派生類的構(gòu)造函在建立對象時,只有最派生類的構(gòu)造函數(shù)調(diào)用虛基類的構(gòu)造函數(shù),該派生類的數(shù)調(diào)用虛基類的構(gòu)造函數(shù),該派生類的其它基類對虛基類構(gòu)造函數(shù)的調(diào)用被忽其它基類對虛基類構(gòu)造函數(shù)的調(diào)用被忽略。略。虛 基 類

溫馨提示

  • 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

提交評論