C++語(yǔ)言程序設(shè)計(jì):第七章 繼承與派生 (2)_第1頁(yè)
C++語(yǔ)言程序設(shè)計(jì):第七章 繼承與派生 (2)_第2頁(yè)
C++語(yǔ)言程序設(shè)計(jì):第七章 繼承與派生 (2)_第3頁(yè)
C++語(yǔ)言程序設(shè)計(jì):第七章 繼承與派生 (2)_第4頁(yè)
C++語(yǔ)言程序設(shè)計(jì):第七章 繼承與派生 (2)_第5頁(yè)
已閱讀5頁(yè),還剩25頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、C+語(yǔ)言程序設(shè)計(jì)浙江工業(yè)大學(xué)第七章第七章 繼承與派生繼承與派生C+C+語(yǔ)言程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)C+語(yǔ)言程序設(shè)計(jì)浙江工業(yè)大學(xué)2本講主要內(nèi)容本講主要內(nèi)容l類的繼承類的繼承l(wèi)類成員的訪問(wèn)控制類成員的訪問(wèn)控制l類型兼容規(guī)則類型兼容規(guī)則l派生類的構(gòu)造、析構(gòu)函數(shù)派生類的構(gòu)造、析構(gòu)函數(shù)l派生類成員的標(biāo)識(shí)與訪問(wèn)派生類成員的標(biāo)識(shí)與訪問(wèn)l程序?qū)嵗绦驅(qū)嵗鼵+語(yǔ)言程序設(shè)計(jì)浙江工業(yè)大學(xué)3派生、訪問(wèn)控制和類型兼容派生、訪問(wèn)控制和類型兼容class 派生類名:派生類名:繼承方式繼承方式 基類名基類名, 成員聲明;成員聲明;public, private, protected類型兼容規(guī)則:一個(gè)公有派生類的對(duì)象在使用上可以被

2、當(dāng)作基類的對(duì)象上一講復(fù)習(xí)C+語(yǔ)言程序設(shè)計(jì)浙江工業(yè)大學(xué)4成員的訪問(wèn)控制成員的訪問(wèn)控制總結(jié)總結(jié)基類基類基類基類自身自身派生類以派生類以公有方式公有方式繼承繼承派生類以派生類以保護(hù)方式保護(hù)方式繼承繼承派生類以派生類以私有方式私有方式繼承繼承成員成員函數(shù)函數(shù)對(duì)象對(duì)象成員成員函數(shù)函數(shù)對(duì)對(duì)象象成員成員函數(shù)函數(shù)對(duì)對(duì)象象成員成員函數(shù)函數(shù)對(duì)對(duì)象象公有公有成員成員xx保護(hù)成員保護(hù)成員xxxx私有成員私有成員xxxxxxx公有繼承:基類的public和protected在派生類中都保持不變;保護(hù)繼承:基類的public和protected在派生類中都是protected;私有方式:基類的public和protect

3、ed在派生類中都是private類型兼容規(guī)則:一個(gè)公有派生類的對(duì)象在使用上可以被當(dāng)作基類的對(duì)象C+語(yǔ)言程序設(shè)計(jì)浙江工業(yè)大學(xué)4.4.派生類的構(gòu)造、析構(gòu)函數(shù)派生類的構(gòu)造、析構(gòu)函數(shù)5C+語(yǔ)言程序設(shè)計(jì)浙江工業(yè)大學(xué)6類的構(gòu)造函數(shù)類的構(gòu)造函數(shù)派生類的構(gòu)造、析構(gòu)函數(shù)類名:類名(形參表):初始化列表 函數(shù)體初始化概念演示初始化列表演示總結(jié):構(gòu)造函數(shù)的執(zhí)行可以分成兩個(gè)階段,初始化階段和計(jì)算階段,初始化階段先于計(jì)算階段。構(gòu)造函數(shù)分類演示C+語(yǔ)言程序設(shè)計(jì)浙江工業(yè)大學(xué)7派生類的構(gòu)造函數(shù)派生類的構(gòu)造函數(shù) 基類的構(gòu)造函數(shù)不被繼承,派生類需基類的構(gòu)造函數(shù)不被繼承,派生類需要聲明自己的構(gòu)造函數(shù)。要聲明自己的構(gòu)造函數(shù)。 聲明構(gòu)

4、造函數(shù)時(shí),只需要對(duì)本類中新聲明構(gòu)造函數(shù)時(shí),只需要對(duì)本類中新增成員進(jìn)行初始化,對(duì)繼承來(lái)的基類增成員進(jìn)行初始化,對(duì)繼承來(lái)的基類成員的初始化由基類構(gòu)造函數(shù)完成。成員的初始化由基類構(gòu)造函數(shù)完成。派生類的構(gòu)造、析構(gòu)函數(shù)派生類名派生類名:派生類名派生類名(基類基類1形參,基類形參,基類2形參,形參,.基類基類n形參,本類形參形參,本類形參):基類名基類名1(參數(shù)參數(shù)), 基類名基類名2(參數(shù)參數(shù)), .基基類名類名n(參數(shù)參數(shù)),對(duì)象數(shù)據(jù)成員的初始化對(duì)象數(shù)據(jù)成員的初始化 本類成員初始化賦值語(yǔ)句;本類成員初始化賦值語(yǔ)句;構(gòu)造函數(shù)演示1構(gòu)造函數(shù)演示2C+語(yǔ)言程序設(shè)計(jì)浙江工業(yè)大學(xué)8派生類與基類的構(gòu)造函數(shù)派生類與

5、基類的構(gòu)造函數(shù) 當(dāng)基類中聲明有默認(rèn)形式的構(gòu)造函數(shù)或未當(dāng)基類中聲明有默認(rèn)形式的構(gòu)造函數(shù)或未聲明構(gòu)造函數(shù)時(shí),派生類構(gòu)造函數(shù)可以不聲明構(gòu)造函數(shù)時(shí),派生類構(gòu)造函數(shù)可以不向基類構(gòu)造函數(shù)傳遞參數(shù)。向基類構(gòu)造函數(shù)傳遞參數(shù)。 若基類中未聲明構(gòu)造函數(shù),派生類中也可若基類中未聲明構(gòu)造函數(shù),派生類中也可以不聲明,全采用默認(rèn)形式構(gòu)造函數(shù)。以不聲明,全采用默認(rèn)形式構(gòu)造函數(shù)。 當(dāng)基類只聲明帶有形參的構(gòu)造函數(shù)時(shí),派當(dāng)基類只聲明帶有形參的構(gòu)造函數(shù)時(shí),派生類也應(yīng)聲明帶形參的構(gòu)造函數(shù),并將參生類也應(yīng)聲明帶形參的構(gòu)造函數(shù),并將參數(shù)傳遞給基類構(gòu)造函數(shù)。數(shù)傳遞給基類構(gòu)造函數(shù)。派生類的構(gòu)造、析構(gòu)函數(shù)演示C+語(yǔ)言程序設(shè)計(jì)浙江工業(yè)大學(xué)9構(gòu)造

6、函數(shù)的調(diào)用順序構(gòu)造函數(shù)的調(diào)用順序1首先首先,在初始化列表中調(diào)用基類構(gòu)造,在初始化列表中調(diào)用基類構(gòu)造函數(shù),執(zhí)行順序按照它們被繼承時(shí)聲函數(shù),執(zhí)行順序按照它們被繼承時(shí)聲明的順序(從左向右)。明的順序(從左向右)。2 其次其次,在初始化列表調(diào)用成員對(duì)象的,在初始化列表調(diào)用成員對(duì)象的構(gòu)造函數(shù),執(zhí)行順序按照它們?cè)陬愔袠?gòu)造函數(shù),執(zhí)行順序按照它們?cè)陬愔新暶鞯捻樞?。聲明的順序? 最后最后,執(zhí)行派生類的構(gòu)造函數(shù)體中的,執(zhí)行派生類的構(gòu)造函數(shù)體中的內(nèi)容。內(nèi)容。派生類的構(gòu)造、析構(gòu)函數(shù)構(gòu)造函數(shù)調(diào)用順序演示C+語(yǔ)言程序設(shè)計(jì)浙江工業(yè)大學(xué)10構(gòu)造函數(shù)構(gòu)造函數(shù)總結(jié)總結(jié)派生類的構(gòu)造、析構(gòu)函數(shù) 所有所有基類和成員對(duì)象基類和成員對(duì)象

7、(只針對(duì)類類型,不包只針對(duì)類類型,不包含基本數(shù)據(jù)類型含基本數(shù)據(jù)類型)都會(huì)在初始化階段初始化,都會(huì)在初始化階段初始化,即使它們沒(méi)有出現(xiàn)在構(gòu)造函數(shù)的初始化列即使它們沒(méi)有出現(xiàn)在構(gòu)造函數(shù)的初始化列表中。表中。 基類基類在初始化列表中進(jìn)行初始化,而在初始化列表中進(jìn)行初始化,而類的類的成員成員有兩種方式,一是使用初始化列表,有兩種方式,一是使用初始化列表,二是在構(gòu)造函數(shù)體內(nèi)進(jìn)行賦值操作。二是在構(gòu)造函數(shù)體內(nèi)進(jìn)行賦值操作。 類類型的成員對(duì)象類類型的成員對(duì)象在構(gòu)造函數(shù)體內(nèi)通過(guò)賦在構(gòu)造函數(shù)體內(nèi)通過(guò)賦值操作進(jìn)行狀態(tài)的設(shè)置,這是一種執(zhí)行效值操作進(jìn)行狀態(tài)的設(shè)置,這是一種執(zhí)行效率較低的做法;而率較低的做法;而基本數(shù)據(jù)類型

8、的成員對(duì)基本數(shù)據(jù)類型的成員對(duì)象象卻沒(méi)有這個(gè)問(wèn)題。卻沒(méi)有這個(gè)問(wèn)題。C+語(yǔ)言程序設(shè)計(jì)浙江工業(yè)大學(xué)11拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù) 若建立派生類對(duì)象時(shí)調(diào)用默認(rèn)拷貝構(gòu)造若建立派生類對(duì)象時(shí)調(diào)用默認(rèn)拷貝構(gòu)造函數(shù),則編譯器將自動(dòng)調(diào)用基類的默認(rèn)函數(shù),則編譯器將自動(dòng)調(diào)用基類的默認(rèn)拷貝構(gòu)造函數(shù)??截悩?gòu)造函數(shù)。 若編寫派生類的拷貝構(gòu)造函數(shù),則需要若編寫派生類的拷貝構(gòu)造函數(shù),則需要為基類相應(yīng)的拷貝構(gòu)造函數(shù)傳遞參數(shù)。為基類相應(yīng)的拷貝構(gòu)造函數(shù)傳遞參數(shù)。派生類的構(gòu)造、析構(gòu)函數(shù)派生類的拷貝構(gòu)造函數(shù)演示C+語(yǔ)言程序設(shè)計(jì)浙江工業(yè)大學(xué)12繼承時(shí)的析構(gòu)函數(shù)繼承時(shí)的析構(gòu)函數(shù) 析構(gòu)函數(shù)也不被繼承,如果需要析構(gòu),析構(gòu)函數(shù)也不被繼承,如果需要析

9、構(gòu),則要在派生類中自行聲明。則要在派生類中自行聲明。 聲明方法與一般(無(wú)繼承關(guān)系時(shí))類的聲明方法與一般(無(wú)繼承關(guān)系時(shí))類的析構(gòu)函數(shù)相同。析構(gòu)函數(shù)相同。 只需負(fù)責(zé)派生類中只需負(fù)責(zé)派生類中新增的非對(duì)象成員新增的非對(duì)象成員的的清理工作即可清理工作即可(例如動(dòng)態(tài)內(nèi)存的釋放例如動(dòng)態(tài)內(nèi)存的釋放) ,不需要顯式地調(diào)用基類和成員對(duì)象的析不需要顯式地調(diào)用基類和成員對(duì)象的析構(gòu)函數(shù),系統(tǒng)會(huì)自動(dòng)隱式調(diào)用。構(gòu)函數(shù),系統(tǒng)會(huì)自動(dòng)隱式調(diào)用。 析構(gòu)函數(shù)的調(diào)用次序與構(gòu)造函數(shù)相反。析構(gòu)函數(shù)的調(diào)用次序與構(gòu)造函數(shù)相反。派生類的構(gòu)造、析構(gòu)函數(shù)派生類的析構(gòu)函數(shù)演示C+語(yǔ)言程序設(shè)計(jì)浙江工業(yè)大學(xué)5.5.派生派生類成員的標(biāo)識(shí)與訪問(wèn)類成員的標(biāo)識(shí)與

10、訪問(wèn)13C+語(yǔ)言程序設(shè)計(jì)浙江工業(yè)大學(xué)14同名隱藏規(guī)則同名隱藏規(guī)則當(dāng)派生類與基類中有同名成員時(shí):當(dāng)派生類與基類中有同名成員時(shí): 若未顯式指定類名,則通過(guò)派生類對(duì)象使用的是派若未顯式指定類名,則通過(guò)派生類對(duì)象使用的是派生類中的同名成員。生類中的同名成員。 如果派生類中聲明了與基類成員函數(shù)同名的新函數(shù),如果派生類中聲明了與基類成員函數(shù)同名的新函數(shù),即使函數(shù)的參數(shù)表不同,從基類繼承的同名函數(shù)的即使函數(shù)的參數(shù)表不同,從基類繼承的同名函數(shù)的所有重載形式也都會(huì)被隱藏。所有重載形式也都會(huì)被隱藏。 如要通過(guò)派生類對(duì)象訪問(wèn)基類中被隱藏的同名成員,如要通過(guò)派生類對(duì)象訪問(wèn)基類中被隱藏的同名成員,應(yīng)使用基類名限定。應(yīng)使

11、用基類名限定。 使用使用作用域分辨符作用域分辨符”:”,例如,例如 類名類名:成員名成員名 或者或者 類名類名:成員名成員名(參數(shù)表參數(shù)表)派生類成員的標(biāo)識(shí)與訪問(wèn)C+語(yǔ)言程序設(shè)計(jì)浙江工業(yè)大學(xué)15#include using namecpace std;class B1/定義基類定義基類B1 public:/外部接口外部接口int nV;void fun() coutMember of B1endl;class B2/定義基類定義基類B2 public:/外部接口外部接口int nV;void fun()coutMember of B2endl;class D1: public B1, publ

12、ic B2 public:int nV;/同名數(shù)據(jù)成員同名數(shù)據(jù)成員void fun()coutMember of D1endl; /同名函數(shù)成員同名函數(shù)成員;派生類成員的標(biāo)識(shí)與訪問(wèn)C+語(yǔ)言程序設(shè)計(jì)浙江工業(yè)大學(xué)16int main() D1 d1;d1.nV=1; /對(duì)象名對(duì)象名.成員名標(biāo)識(shí)成員名標(biāo)識(shí), 訪問(wèn)訪問(wèn)D1類成員類成員d1.fun(); d1.B1:nV=2;/作用域分辨符標(biāo)識(shí)作用域分辨符標(biāo)識(shí), 訪問(wèn)基類訪問(wèn)基類B1成員成員d1.B1:fun();d1.B2:nV=3;/作用域分辨符標(biāo)識(shí)作用域分辨符標(biāo)識(shí), 訪問(wèn)基類訪問(wèn)基類B2成員成員d1.B2:fun(); return 0;C+語(yǔ)言

13、程序設(shè)計(jì)浙江工業(yè)大學(xué)17二義性問(wèn)題二義性問(wèn)題 在多繼承時(shí),基類之間出現(xiàn)同名成員在多繼承時(shí),基類之間出現(xiàn)同名成員時(shí),將出現(xiàn)訪問(wèn)時(shí)的二義性(不確定時(shí),將出現(xiàn)訪問(wèn)時(shí)的二義性(不確定性)性)用類名限定,或同名隱藏規(guī)用類名限定,或同名隱藏規(guī)則來(lái)解決。則來(lái)解決。 當(dāng)派生類從多個(gè)基類派生,而這些基當(dāng)派生類從多個(gè)基類派生,而這些基類又從同一個(gè)基類派生,則在訪問(wèn)此類又從同一個(gè)基類派生,則在訪問(wèn)此共同基類中的成員時(shí),將產(chǎn)生二義共同基類中的成員時(shí),將產(chǎn)生二義性性采用虛基類來(lái)解決。采用虛基類來(lái)解決。派生類成員的標(biāo)識(shí)與訪問(wèn)C+語(yǔ)言程序設(shè)計(jì)浙江工業(yè)大學(xué)18二義性問(wèn)題舉例(一)二義性問(wèn)題舉例(一)class A publi

14、c: void f();class B public: void f(); void g();class C: public A, piblic B public: void g(); void h();如果聲明:如果聲明:C c1;則則 c1.f(); 具有二義性具有二義性而而 c1.g(); 無(wú)二義性(同名隱藏)無(wú)二義性(同名隱藏)派生類成員的標(biāo)識(shí)與訪問(wèn)C+語(yǔ)言程序設(shè)計(jì)浙江工業(yè)大學(xué)19二義性的解決方法二義性的解決方法 解決方法一:用類名來(lái)限定解決方法一:用類名來(lái)限定c1.A:f() 或或 c1.B:f() 解決方法二:同名隱藏解決方法二:同名隱藏在在C 中聲明一個(gè)同名成員函數(shù)中聲明一個(gè)同名

15、成員函數(shù)f(),在,在f()中根據(jù)需要調(diào)用中根據(jù)需要調(diào)用 A:f() 或或 B:f()派生類成員的標(biāo)識(shí)與訪問(wèn)C+語(yǔ)言程序設(shè)計(jì)浙江工業(yè)大學(xué)20二義性問(wèn)題舉例(二)二義性問(wèn)題舉例(二)class B public: int b;class B1 : public B private: int b1;class B2 : public B private: int b2;class C : public B1,public B2 public: int f(); private: int c;BB1B2CB派生類成員的標(biāo)識(shí)與訪問(wèn)C+語(yǔ)言程序設(shè)計(jì)浙江工業(yè)大學(xué)派生類派生類C的對(duì)象的存儲(chǔ)結(jié)構(gòu)示意圖:的對(duì)象

16、的存儲(chǔ)結(jié)構(gòu)示意圖:bb1bb2cB類成員B類成員B1類成員B2類成員C類對(duì)象有二義性:有二義性:C c;c.bc.B:b無(wú)二義性:無(wú)二義性:c.B1:bc.B2:bBB1B2CB演示C+語(yǔ)言程序設(shè)計(jì)浙江工業(yè)大學(xué)22虛基類虛基類 虛基類的引入虛基類的引入 用于有共同基類的場(chǎng)合用于有共同基類的場(chǎng)合 聲明聲明 以以virtual修飾說(shuō)明基類修飾說(shuō)明基類例:例:class B1: virtual public B 作用作用 主要用來(lái)解決多繼承時(shí)可能發(fā)生的對(duì)同一基類繼承主要用來(lái)解決多繼承時(shí)可能發(fā)生的對(duì)同一基類繼承多次而產(chǎn)生的二義性問(wèn)題多次而產(chǎn)生的二義性問(wèn)題. 為最遠(yuǎn)的派生類提供惟一的基類成員,而不重復(fù)產(chǎn)

17、為最遠(yuǎn)的派生類提供惟一的基類成員,而不重復(fù)產(chǎn)生多次拷貝生多次拷貝 注意:注意: 在第一級(jí)繼承時(shí)就要將共同基類設(shè)計(jì)為虛基類。在第一級(jí)繼承時(shí)就要將共同基類設(shè)計(jì)為虛基類。派生類成員的標(biāo)識(shí)與訪問(wèn)C+語(yǔ)言程序設(shè)計(jì)浙江工業(yè)大學(xué)23虛基類舉例虛基類舉例class B private: int b;class B1 : virtual public B private: int b1;class B2 : virtual public B private: int b2;class C : public B1, public B2 private: float c;下面的訪問(wèn)是正確的:下面的訪問(wèn)是正確的:C

18、cobj;cobj.b;派生類成員的標(biāo)識(shí)與訪問(wèn)C+語(yǔ)言程序設(shè)計(jì)浙江工業(yè)大學(xué)虛基類的派生類對(duì)象存儲(chǔ)結(jié)構(gòu)示意圖:虛基類的派生類對(duì)象存儲(chǔ)結(jié)構(gòu)示意圖:BB1B2Cb1b2cB1類成員B2類成員C類對(duì)象bB類成員24派生類成員的標(biāo)識(shí)與訪問(wèn)C+語(yǔ)言程序設(shè)計(jì)浙江工業(yè)大學(xué)25例例7-8虛基類舉例虛基類舉例D1nV :int nVd:intB1:nV1:intB2:nV2:intfund():voidfun():voidB1nV1 :intB2nV2 :intD1nVd :intfund():void B0nV :intfun()派生類成員的標(biāo)識(shí)與訪問(wèn)C+語(yǔ)言程序設(shè)計(jì)浙江工業(yè)大學(xué)B0B1新增成員B0B2新增成員

19、D1新增成員B0B0B1B2D1nV,fun()26派生類派生類D1的對(duì)象的存儲(chǔ)結(jié)構(gòu)示意圖的對(duì)象的存儲(chǔ)結(jié)構(gòu)示意圖演示派生類成員的標(biāo)識(shí)與訪問(wèn)C+語(yǔ)言程序設(shè)計(jì)浙江工業(yè)大學(xué)27虛基類及其派生類構(gòu)造函數(shù)虛基類及其派生類構(gòu)造函數(shù) 建立對(duì)象時(shí)所指定的類稱為建立對(duì)象時(shí)所指定的類稱為最(遠(yuǎn))派生類最(遠(yuǎn))派生類。 虛基類的成員是由最派生類的構(gòu)造函數(shù)通過(guò)調(diào)虛基類的成員是由最派生類的構(gòu)造函數(shù)通過(guò)調(diào)用虛基類的構(gòu)造函數(shù)進(jìn)行初始化的。用虛基類的構(gòu)造函數(shù)進(jìn)行初始化的。 在整個(gè)繼承結(jié)構(gòu)中,直接或間接繼承虛基類的在整個(gè)繼承結(jié)構(gòu)中,直接或間接繼承虛基類的所有派生類,都必須在構(gòu)造函數(shù)的成員初始化所有派生類,都必須在構(gòu)造函數(shù)的成員初始化表中給出對(duì)虛基類的構(gòu)造函數(shù)的調(diào)用。如果未表中給出對(duì)虛基類的構(gòu)造函數(shù)的調(diào)用。如果未列出,則表示調(diào)用該虛基類的默認(rèn)構(gòu)造函數(shù)。列出,則表示調(diào)用該虛基類的默認(rèn)構(gòu)造函數(shù)。 在建立對(duì)象時(shí),只有最派

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論