版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,7.1 繼承的好處 7.2 C +定義派生類的語(yǔ)法 7.3 基類成員的訪問屬性 7.4 派生類對(duì)象的初始化 7.5 多重繼承 7.6 基類與派生類之間的轉(zhuǎn)換 7.7 小結(jié),第七章 繼承性,7.1 繼承的好處,當(dāng)原來(lái)使用的數(shù)據(jù)結(jié)構(gòu)不適應(yīng)新系統(tǒng)的需求,或原來(lái)提供的功能需要擴(kuò)充,或原來(lái)的性能不能滿足現(xiàn)在的要求時(shí),派生類的成員函數(shù)可以調(diào)用基類的成員函數(shù),并在此基礎(chǔ)上增加必要的程序代碼; 當(dāng)需要完全改變?cè)胁僮鞯膶?shí)現(xiàn)算法時(shí),可以在派生類中實(shí)現(xiàn)一個(gè)與基類成員函數(shù)同名而算法不同的成員函數(shù); 當(dāng)需要增加新功能時(shí),可以在派生類中定義一個(gè)新的成員函數(shù)。 繼承性還使得用戶在開發(fā)新的應(yīng)用系統(tǒng)
2、時(shí)不必完全從零開始,可以繼承原有的相似系統(tǒng)的功能或者從類庫(kù)中選取適用的類,再派生出新的類以實(shí)現(xiàn)所需要的功能。,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,下面讓我們通過(guò)一個(gè)具體例子來(lái)感受一下使用繼承機(jī)制的必要: class String private: char *contents;/說(shuō)明了一個(gè)字符串首地址的指針 int length;/字符串長(zhǎng)度 public: String() length = 0; int get_length() return length; char *get_contents() return contents; void set_contents(int in_length,c
3、har *in_contents); void set_contents(char *in_contents); ;,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,可以利用C +語(yǔ)言提供的繼承機(jī)制,從String類派生出新的派生類EditString,增加了移動(dòng)光標(biāo),在光標(biāo)處編輯的處理功能: class EditString : public String/派生類EditString的定義 private: int cursor; public: EditString(int offset = 0) cursor = offset; int get_cursor() return cursor; void mov
4、e_cursor(int offset);/ 把光標(biāo)移到指定位置 void add(String *text);/ 在光標(biāo)后添加一個(gè)字符串 void replace(String *text);/ 把光標(biāo)后內(nèi)容換成新字符串 void del(int how_much); / 刪除光標(biāo)后指定個(gè)數(shù)的字符 ;,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,下面是使用String類和EditString類的一個(gè)主函數(shù): void main() String s1;/聲明基類String的對(duì)象s1 EditString s2;/聲明派生類EditString的對(duì)象s2 char *p; s1.set_contents(11
5、,Hello, world); p = s1.get_contents(); s2.set_contents(11, p); s2.move_cursor(6); s2.replace(“Students”); ,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,為了軟件復(fù)用,必須具有: 抽象機(jī)制 將一組相似模塊中的共性內(nèi)容抽象出來(lái),作為基類的內(nèi)容向外部世界共享。 繼承機(jī)制 無(wú)需修改原有程序模塊的代碼就可以重用原有的程序資源并對(duì)其功能進(jìn)行擴(kuò)充。,7.2 C+定義派生類的語(yǔ)法 7.2.1 定義派生類的語(yǔ)法,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,圖7.1書寫父類表的語(yǔ)法,7.2.2 訪問權(quán)修飾符,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,表7.1父
6、類成員在子類中的訪問屬性,三條規(guī)律: 派生類成員函數(shù)不能直接訪問基類的私有成員。 派生類繼承了基類的私有成員,在創(chuàng)建派生類對(duì)象時(shí),先為基類中說(shuō)明的數(shù)據(jù)成員(包括私有數(shù)據(jù)成員)分配內(nèi)存,然后才為派生類中說(shuō)明的數(shù)據(jù)成員分配內(nèi)存,所有上述成員都屬于這個(gè)新創(chuàng)建的對(duì)象。 如果在子類中需要使用從父類繼承來(lái)的父類私有成員,必須通過(guò)父類公有(或保護(hù))的成員函數(shù)訪問。,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版, 訪問權(quán)修飾符只能使繼承來(lái)的成員的可訪問性受到更嚴(yán)格限制,而不能放松這種限制。 在繼承機(jī)制下信息隱藏的最好方法,是在基類中使用訪問權(quán)符protected。 在基類中使用訪問權(quán)符protected聲明的成員,可由派生類的成
7、員函數(shù)直接訪問,在派生類之外,任何函數(shù)是不能直接訪問的。通常把被派生類繼承后需較頻繁使用的基類數(shù)據(jù)成員的訪問屬性規(guī)定為protected。,使用訪問權(quán)修飾符時(shí)的注意事項(xiàng): 要區(qū)分訪問權(quán)修飾符與訪問權(quán)符的概念,在定義派生類時(shí),派生類通過(guò)訪問權(quán)修飾符從基類獲得一定權(quán)限,進(jìn)行公有派生、保護(hù)派生或私有派生,例如:class B:public A;,這時(shí)語(yǔ)句中的public即為訪問權(quán)修飾符;而當(dāng)一個(gè)類定義過(guò)程中,有些數(shù)據(jù)成員被封裝在公有部分,有些數(shù)據(jù)成員被封裝在私有部分,而這時(shí)使用的public、protected及private即為訪問權(quán)符。 如果訪問權(quán)修飾符為public,則派生類中方法和數(shù)據(jù)成員的
8、訪問權(quán)限不變(同基類),但如果訪問權(quán)修飾符為protected或private,則派生類中的方法和數(shù)據(jù)成員的訪問權(quán)限變小,具體請(qǐng)參見表7.1父類成員在子類中的訪問屬性加以理解。,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,在實(shí)際開發(fā)過(guò)程中,允許其他類使用的方法(即成員 函數(shù))及數(shù)據(jù)成員(變量)應(yīng)該定義在public訪問權(quán)符之下 的部分,為外界提供一個(gè)服務(wù)接口。 準(zhǔn)備作為繼承或派生的方法或數(shù)據(jù)成員應(yīng)該定義在 protected訪問權(quán)符之下的部分。將僅作為本類使用的方法 或數(shù)據(jù)成員應(yīng)該定義在private訪問權(quán)符之下的部分。 不建議把類屬性說(shuō)明在public訪問權(quán)符之下的部分,通 常說(shuō)明于protected與pri
9、vate訪問權(quán)符之下的部分,以保證 程序的安全可靠。,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,7.3 基類成員的訪問屬性,基類成員被派生類繼承之后,它的訪問屬性與 原來(lái)在基類中的訪問屬性可以有所不同。調(diào)整基類 成員訪問屬性的基本手段是訪問權(quán)修飾符,在上一 節(jié)中已經(jīng)系統(tǒng)全面地講述了訪問權(quán)修飾符對(duì)基類成 員訪問屬性的調(diào)整作用,本節(jié)進(jìn)一步講述調(diào)整基類 成員訪問屬性的其他方法,以及基類特殊成員在派 生類中的訪問屬性。,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,7.3.1 同名成員,為了在派生類中使用基類的同名成員,必須在 該成員名之前加上基類名和作用域分辨符“:”作為 限定符,即必須使用下列格式才能訪問到基類的 同名成員: 基類名
10、 : 成員名,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,C+語(yǔ)言允許在派生類中說(shuō)明的成員與基類中的成 員名字相同,稱派生類成員覆蓋了基類的同名成員,在派 生類中使用這個(gè)名字意味著訪問在派生類中重新定義的成 員。為了在派生類中使用基類的同名成員,必須在該成員 名之前加上基類名和作用域分辨符“”作為限定符。 例如: class Base protected: int a,b; public: Base(int i,int j) a=i; b=j;/基類中說(shuō)明的數(shù)據(jù)成員b ;,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,class Derived:public Base int b,c; public: Derived(int x1
11、,int x2,int x3,int x4):Base(x1,x2) b=x3;/派生類中說(shuō)明的數(shù)據(jù)成員b c=x4; void set_c(int x) c=x+b+Base:b; /b為派生類中的b(屏蔽了基類中的 /b),Base:b為基類中的b(在派 /生類中使用基類中的成員) ;,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,下面我們?cè)倏匆粋€(gè)同名成員函數(shù)屏蔽的例子: #include “stdafx.h” #include “iostream.h” class Base public: void fun( )cout Base : fun() endl; void fun(int i)cout Base
12、 : fun(int i) endl; /說(shuō)明了一個(gè)fun()函數(shù)的重載函數(shù) ; class Derive :public Base public: void fun( )cout Derive : fun( ) endl; /在派生類中說(shuō)明一個(gè)fun( )函數(shù) ;,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,void main( ) Base e;/說(shuō)明了一個(gè)基類對(duì)象 e.fun( );/通過(guò)基類對(duì)象調(diào)用的是基類中的成員函數(shù)fun( ) e.fun(3);/通過(guò)基類對(duì)象調(diào)用的是基類中的重載的成員函數(shù)fun(int i) Derive d;/說(shuō)明了一個(gè)派生類對(duì)象 d.fun( );/通過(guò)派生類對(duì)象調(diào)用的是派生類
13、中的成員函數(shù)fun( ), /基類的fun( )及其他重載的成員函數(shù)均被屏蔽 /d.fun(3);/此行若不是注釋,編譯將會(huì)出現(xiàn)錯(cuò)誤 d.Base : fun( );/利用派生類對(duì)象,通過(guò)“類名 : ”限定,調(diào)用基類 /的成員函數(shù) d.Base : fun(3);/調(diào)用基類的重載成員函數(shù) ,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,運(yùn)行結(jié)果: Base : fun() Base : fun(int i) Derive : fun() Base : fun() Base : fun(int i),注意: 派生類屏蔽基類中的同名成員函數(shù),是指屏 蔽了基類中的該同名函數(shù)及其所有重載函數(shù)。 由于派生類中“fun()”
14、函數(shù)屏蔽了基類中“fun()” 函數(shù)的所有版本,因此,“d.fun(3);”的操作,會(huì) 出現(xiàn)錯(cuò)誤提示“error C2660: fun : function does not take 1 parameters”。,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,7.3.2 靜態(tài)成員,不論是公有派生還是私有派生,派生類都可以 使用基類的靜態(tài)成員,使用時(shí)唯一的要求是,必須 用“類名:成員名”代表這個(gè)靜態(tài)成員。例如: class Base public: static void a(); void b(); ; class Derived:private Base . ; class DD:public Derived
15、 void func(); ;,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,void DDfunc() Basea(); / 編譯通過(guò) a(); / 編譯出錯(cuò) b(); / 編譯出錯(cuò) ,在上面的程序片斷中,Derived類從Base類私有派生,繼承來(lái)的函數(shù)b已經(jīng)成為Derived類的私有成員函數(shù),因此,它的子類DD不能直接使用函數(shù)b; 函數(shù)a是Base類的靜態(tài)成員函數(shù),它不受訪問權(quán)修飾符的影響,在間接派生類DD中仍然可以直接使用,但是,使用它的時(shí)候必須用“類名:函數(shù)名”顯式指定它,否則會(huì)產(chǎn)生編譯錯(cuò)誤。,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,在靜態(tài)成員函數(shù)的實(shí)現(xiàn)中不能直接使用類中聲明的非靜態(tài)成員,可以使用類中聲明的靜態(tài)成員。
16、如果需要使用非靜態(tài)成員時(shí),可通過(guò)對(duì)象使用。 例子:,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,例7_1,7.3.3 訪問聲明,當(dāng)一個(gè)類B是從其父類A私有派生的時(shí)候,它所繼承的父 類公有段或保護(hù)段的所有成員,在這個(gè)派生類中的訪問屬性 都成為私有的,如果從類B再派生出類C,則類C不能直接訪 問其間接基類A的任何非靜態(tài)成員。為了使程序員具有必要的靈活性 ,以方便應(yīng)用系統(tǒng)的開發(fā),C+語(yǔ)言提供了一種調(diào)節(jié)機(jī)制,稱為訪問聲明,它是對(duì)私有派生方法的一種補(bǔ)充。 舉例說(shuō)明使用訪問聲明的方法: (續(xù)下頁(yè)),面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,class Base int x; public: int y,z; int f(int i); ;
17、 class Derived:private Base/Derived類從Base類私有派生 int a; public: Basey; / 調(diào)整Basey的訪問屬性 int b; void p(); ;,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,上例中Base類公有段的所有成員原本都應(yīng)該成 為Derived類的私有成員,但是,使用訪問聲明: Base:y 把Base類的公有成員y在私有派生類Derived中 顯式聲明為公有的,就使得Derived類的派生類仍 然可以直接訪問它。,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,使用訪問聲明機(jī)制時(shí)應(yīng)該注意以下幾點(diǎn)規(guī)則: 訪問聲明僅僅調(diào)整名字的訪問屬性,不允許為它說(shuō) 明任何類型。 不
18、允許利用訪問聲明機(jī)制,在派生類中提高或降低 基類成員的可訪問性,也就是說(shuō),基類的公有段或保護(hù)段的 成員,在派生類中的訪問屬性僅能利用訪問聲明機(jī)制相應(yīng) 地說(shuō)明為公有的或保護(hù)的。 (參看書p158第3行開始的例子),面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版, 對(duì)重載函數(shù)名的訪問聲明,將調(diào)整基類中具有該名字的所有成員函數(shù)的訪問屬性 ,在基類中訪問屬性不同的重載函數(shù)名不能通過(guò)訪問聲明調(diào)整其訪問屬性,否則與規(guī)則(2)發(fā)生矛盾。 (參看書p158例子) 如果派生類中說(shuō)明了一個(gè)與基類成員同名的成員,則不能使用訪問聲明調(diào)整該名字的訪問屬性,否則在派生類中會(huì)形成對(duì)同一名字的二次說(shuō)明。,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,定義一個(gè)派生類之
19、后,它將繼承其基類中的全部成員。創(chuàng)建了派生類的一個(gè)對(duì)象之后,該對(duì)象中不僅包含在派生類中聲明的數(shù)據(jù)成員,而且還包含它從基類繼承的全部數(shù)據(jù)成員。 也就是說(shuō),在創(chuàng)建派生類的對(duì)象時(shí),編譯程序不僅要為這個(gè)派生類中聲明的數(shù)據(jù)成員分配內(nèi)存空間,還要為它的基類中聲明的數(shù)據(jù)成員分配內(nèi)存空間,怎樣在這些內(nèi)存空間中放置初始數(shù)值呢?這就是派生類對(duì)象的初始化問題。 派生類對(duì)象的初始化與非派生類對(duì)象初始化的主要區(qū)別在于,既要完成派生類本身聲明的數(shù)據(jù)成員的初始化工作,又要同時(shí)完成從其基類繼承來(lái)的數(shù)據(jù)成員的初始化工作。,7.4 派生類對(duì)象的初始化,派生類對(duì)象的初始化問題實(shí)質(zhì)上就是,當(dāng)創(chuàng)建派生類的一個(gè)對(duì)象時(shí),怎樣在調(diào)用派生類本
20、身構(gòu)造函數(shù)的同時(shí)也調(diào)用基類的構(gòu)造函數(shù)。C+通過(guò)在派生類構(gòu)造函數(shù)中列出基類初始串列的方法,提供了這種初始化基類數(shù)據(jù)成員的機(jī)制。 C+語(yǔ)言定義派生類構(gòu)造函數(shù)的格式為: 派生類名(變?cè)?:父類名1(變表),父類名m (變?cè)?,對(duì)象成員名1(變?cè)?,對(duì)象成員名n(變?cè)? . 下面的程序片斷舉例說(shuō)明了派生類對(duì)象的初始化方法:,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,class Base int p1,p2; public: Base(int i1,int i2) p1=i1; p2=i2; ,class Derived:Base int p3; Base obj; / 對(duì)象成員 public: /* 注意下面
21、的構(gòu)造函數(shù)定義:派生類構(gòu)造函數(shù)參數(shù)表中的各參數(shù)均為形參,而基類構(gòu)造函數(shù)和對(duì)象初始串列中的各參數(shù)均為實(shí)參。 */ Derived(int x1, int x2, int x3, int x4, int x5) : Base(x1, x2) , obj(x3, x4) p3=x5; ; main() Derived d(27,28,100,200,-50); ,在上列的主函數(shù)main中,說(shuō)明Derived類的對(duì) 象d時(shí),自動(dòng)調(diào)用構(gòu)造函數(shù),先父類(即將p1、p2 賦值為i1、i2即27、28),再類對(duì)象(即把obj對(duì) 象成員中的obj.p1、obj.p2賦值為obj.i1、obj.i2即 100、2
22、00),最后自己(即將p3賦值為-50),經(jīng) 過(guò)上述過(guò)程,結(jié)果把各個(gè)數(shù)據(jù)初始化為: p1 = 27,p2 = 28, obj.p1 = 100, obj.p2 = 200, p3 = -50,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,關(guān)于派生類對(duì)象的初始化,最后再說(shuō)明幾點(diǎn): 在派生類構(gòu)造函數(shù)的初始串列中,使用父類類名 來(lái)調(diào)用父類構(gòu)造函數(shù),使用對(duì)象成員名來(lái)調(diào)用內(nèi)層 類的構(gòu)造函數(shù)。 當(dāng)使用父類或內(nèi)層類的有參數(shù)的構(gòu)造函數(shù)來(lái)完成 基類成員或?qū)ο蟪蓡T的初始化時(shí),即使派生類構(gòu)造 函數(shù)本身無(wú)需完成任何工作(函數(shù)體為空),也必須 定義派生類的構(gòu)造函數(shù)。,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,如果在定義派生類構(gòu)造函數(shù)時(shí)省略父類初始串列,
23、則意味著使用父類的缺省構(gòu)造函數(shù)來(lái)初始化基類成 員。在這種情況下如果父類中只定義了有參數(shù)的構(gòu)造 函數(shù),而沒有定義無(wú)參數(shù)或全部參數(shù)都有缺省值的構(gòu) 造函數(shù),則在編譯時(shí)會(huì)產(chǎn)生編譯錯(cuò)誤。 派生類構(gòu)造函數(shù)的執(zhí)行順序是,先父母(執(zhí)行父類構(gòu) 造函數(shù)),再客人(初始化對(duì)象成員),最后自己(初始化 派生類本身的普通數(shù)據(jù)成員)。,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,7.5 多重繼承 7.5.1 語(yǔ)法,派生類還可以有多個(gè)直接基類,這種繼承關(guān)系 稱為多重繼承,也稱為多繼承。定義多重繼承的 派生類與定義單繼承的派生類的唯一差別是,在 父類表中應(yīng)該列出多個(gè)父類名,每個(gè)父類名之前 可以冠以關(guān)鍵字private或public;也可以省略
24、這些 訪問權(quán)修飾符而使用缺省的訪問權(quán)修飾符,不同 父類名之間應(yīng)該用逗號(hào)“,”隔開。,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,7.5.2 同名引出的二義性,當(dāng)多重繼承的派生類的不同父類中含有同名 成員時(shí),這些成員都會(huì)被派生類所繼承,如果在 派生類中簡(jiǎn)單地通過(guò)名字來(lái)使用這些成員,就會(huì) 產(chǎn)生二義性。為了避免二義性,在派生類中使用 不同父類的同名成員時(shí),必須在成員名之前用基 類名加作用域分辨符來(lái)限定,以明確指出所使用 的成員是從哪個(gè)基類繼承來(lái)的。,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,make為方法名 i 為形參 in表示i為輸入?yún)?shù) int表示i的類型,下面的簡(jiǎn)單程序說(shuō)明了同名帶來(lái)的二義性及避免二義
25、性的方法。例如: 為了實(shí)際工程中不鼓勵(lì)使用同名,在任何有可能引起誤解的地方,要避免使用相同的名字。,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,例7_2,7.5.3 公共基類帶來(lái)的二義性,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,圖7.3 公共基類帶來(lái)的二義性,#include ”iostream.h” class Base protected: int a; public: Base(int i) a=i; ; class Derived1:public Base int d1; public: Derived1(int p1,int p2):Base(p1) d1=p2; ; class Derived2:public B
26、ase int d2; public: Derived2(int x1,int x2):Base(x1) d2=x2; ;,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,class DD:Derived1,Derived2 public: DD(int i1,int i2,int i3,inti4):Derived1(i1,i2),Derived2(i3,i4) void display() cout a n; ; 當(dāng)編譯程序分析到DD類的成員函數(shù)display時(shí),將給出出錯(cuò)信息,指出存在二義性,什么原因呢?,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,為了消除因公共基類而引出的二義性問題,同樣必須使用基類名加作用域分辨符來(lái)限定有
27、二義性的成員名。如果想輸出從Derived1類繼承來(lái)的數(shù)據(jù)成員a,則應(yīng)該把輸出語(yǔ)句寫為: cout Derived1:a n; 反之,如果要輸出從Derived2類繼承來(lái)的數(shù)據(jù)成員a,則應(yīng)該像下面那樣寫輸出語(yǔ)句: cout Derived2:a n;,7.5.4 虛基類,為解決在多重繼承環(huán)境中因公共基類而帶來(lái)的二 義性問題,C+語(yǔ)言提供了虛基類(虛擬基類)機(jī)制。 為了把一個(gè)基類定義為虛基類,必須在定義派生 類時(shí)在父類表中虛基類名字前加上關(guān)鍵字Virtual。聲 明虛基類的一般格式為: class 派生類名:Virtual 訪問權(quán)修飾符 父類名 . ;,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,#include
28、 ”iostream.h” class Base protected: int a; public: Base(int i) a=i; ; class Derived1:virtual public Base int d1; public: Derived1(int p1,int p2):Base(p1) d1=p2; ; (續(xù)下頁(yè)),面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,class Derived2:virtual public Base int d2; public: Derived2(int x1,int x2):Base(x1) d2=x2; ; class DD:Derived1,Derived
29、2 public: DD(int i1,int i2,int i3,int i4):Derived1(i1,i2), Derived2(i3,i4),Base(i1) void display() cout a n; ;,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,(a) 未使用虛基類,圖7.4 示例程序的類等級(jí),圖(b) 使用虛基類,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,由于在派生類DD的實(shí)例中只有基類Base中定 義的數(shù)據(jù)成員a的一份拷貝,因此,使用虛基類不 僅能消除公共基類可能帶來(lái)的二義性問題,而且 能節(jié)省內(nèi)存空間。當(dāng)然,如果在解決實(shí)際應(yīng)用問 題時(shí),在派生類對(duì)象中確實(shí)需要公共基類中定義 的數(shù)
30、據(jù)成員的多份拷貝,則不宜使用虛基類。此 外,虛基類增加了系統(tǒng)的時(shí)間開銷,使用虛基類 機(jī)制時(shí)應(yīng)該考慮這個(gè)因素。非必要時(shí)不要過(guò)多地 使用虛基類。,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,在使用虛基類機(jī)制時(shí)應(yīng)該注意以下幾點(diǎn): 必須在最新派生出來(lái)的派生類的初始串列中,調(diào)用虛基類的構(gòu)造函數(shù),以初始化在虛基類中定義的數(shù)據(jù)成員。 初始串列中各個(gè)基類構(gòu)造函數(shù)的調(diào)用順序是,先調(diào)用虛基類構(gòu)造函數(shù),然后調(diào)用非虛基類構(gòu)造函數(shù)。例如,在本節(jié)給出的示例程序中,在執(zhí)行DD類的構(gòu)造函數(shù)時(shí),先調(diào)用虛基類Base的構(gòu)造函數(shù),然后再調(diào)用普通基類Derived1和Derived2的構(gòu)造函數(shù)。 虛基類的構(gòu)造函數(shù)僅調(diào)用一次,虛基類的構(gòu)造函數(shù)由最新派生
31、出來(lái)的派生類負(fù)責(zé)調(diào)用。 如果在最新派生出來(lái)的派生類的初始串列中,沒有顯式調(diào)用虛基類構(gòu)造函數(shù),則編譯程序?qū)⒄{(diào)用虛基類的缺省構(gòu)造函數(shù)。,7.6 基類與派生類之間的轉(zhuǎn)換,在滿足一定的限定條件的前提下,C+語(yǔ)言可以自動(dòng)地把一個(gè)派生類對(duì)象隱式地轉(zhuǎn)換成一個(gè)基類對(duì)象。 可以在程序中用派生類對(duì)象給基類對(duì)象賦值。在這種情況下,實(shí)際上是用派生類對(duì)象從其基類繼承來(lái)的數(shù)據(jù)成員的值,給基類對(duì)象的相應(yīng)數(shù)據(jù)成員賦值 。 派生類對(duì)象擁有的數(shù)據(jù)成員,在基類對(duì)象中并不一定都有。如果使用基類對(duì)象給派生類對(duì)象賦值,則賦值后派生類對(duì)象的某些數(shù)據(jù)成員的值將是無(wú)意義的。因此, C不允許使用基類對(duì)象給派生類對(duì)象賦值。,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二
32、版,7.6.1 賦值兼容規(guī)則,首先,必須強(qiáng)調(diào)指出的是,能夠自動(dòng)轉(zhuǎn)換的 前提條件是,派生類從其基類公有派生。例如, 下面定義的兩個(gè)類: class Base.; class Derived : public Base.; 則派生類Derived的對(duì)象具備自動(dòng)轉(zhuǎn)換成其基 類Base的對(duì)象的條件。,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,下列幾種情況是合法的: 可以用派生類對(duì)象給基類對(duì)象賦值。 Base b; Derived d; b=d; 可以用派生類對(duì)象來(lái)初始化基類的引用。 Derived d; Base ,面向?qū)ο蟪绦蛟O(shè)計(jì) 第二版,可以把派生類對(duì)象的地址賦值給指向基類的指針。 Derived d; Base *bptr=,在程序設(shè)計(jì)中應(yīng)用賦值兼容規(guī)則時(shí)必須清楚,對(duì)象(或指向?qū)ο蟮闹羔?所能訪問的成員,
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度個(gè)人經(jīng)營(yíng)性貸款還款協(xié)議模板8篇
- 二零二五年廢棄物處理及廢品回收承包合同書3篇
- 二零二五年度倉(cāng)儲(chǔ)租賃與智能化改造合同3篇
- 二零二五年度外資獨(dú)資公司股權(quán)變更操作細(xì)則合同
- 2025年個(gè)人汽車維修服務(wù)質(zhì)押擔(dān)保合同3篇
- 2025版高端餐飲集團(tuán)租賃管理與服務(wù)保障合同3篇
- 個(gè)人委托支付事務(wù)具體合同版B版
- 2024酒店裝修設(shè)計(jì)合同
- 2025年度智能果園蘋果采購(gòu)與銷售管理合同4篇
- 2025年度園林景觀設(shè)計(jì)專利授權(quán)許可合同3篇
- 碳纖維增強(qiáng)復(fù)合材料在海洋工程中的應(yīng)用情況
- 多重耐藥菌病人的管理-(1)課件
- (高清版)TDT 1056-2019 縣級(jí)國(guó)土資源調(diào)查生產(chǎn)成本定額
- 環(huán)境監(jiān)測(cè)對(duì)環(huán)境保護(hù)的意義
- 2023年數(shù)學(xué)競(jìng)賽AMC8試卷(含答案)
- 神經(jīng)外科課件:神經(jīng)外科急重癥
- 2024年低壓電工證理論考試題庫(kù)及答案
- 2023年十天突破公務(wù)員面試
- 《瘋狂動(dòng)物城》中英文對(duì)照(全本臺(tái)詞)
- 醫(yī)院住院醫(yī)師規(guī)范化培訓(xùn)證明(樣本)
- 小學(xué)六年級(jí)語(yǔ)文閱讀理解100篇(及答案)
評(píng)論
0/150
提交評(píng)論