版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第七章第七章 繼承與派生繼承與派生本章主要內(nèi)容本章主要內(nèi)容1. 類的繼承與派生的提出2. 派生類的定義與相關(guān)概念3. 三種基本繼承方式4. 派生類的構(gòu)造與析構(gòu)函數(shù)5. 派生類的成員標(biāo)示與訪問6. 虛基類7. 賦值兼容規(guī)則類的繼承與派生的提出類的繼承與派生的提出問題:問題:1.我會使用windows98 ,我需要重新學(xué)習(xí)XP操作系統(tǒng)嗎?2.我定義了一個描述點的類,如何在定義一個描述矩形的類?現(xiàn)實思維?,F(xiàn)實思維模式式.WH事物發(fā)展事物發(fā)展有其延續(xù)有其延續(xù)性!性!類的繼承與派生的提出類的繼承與派生的提出 繼承的目的繼承的目的:實現(xiàn)數(shù)據(jù)、代碼的重用。 派生的目的派生的目的:當(dāng)新的問題出現(xiàn),原有程序無法
2、解決(或不能完全解決)時,需要對原有數(shù)據(jù)、代碼進(jìn)行改造。 返返 回回派生類的定義與相關(guān)概念派生類的定義與相關(guān)概念定義格式:定義格式:class 派生類名:繼承方式1 基類名1,繼承方式n 基類名n成員聲明; 注:繼承方式注:繼承方式1. 公有繼承public2. 私有繼承private3. 保護(hù)繼承protected1.保持已有類的特性而構(gòu)造新類的過程稱為保持已有類的特性而構(gòu)造新類的過程稱為繼承繼承。2.在已有類的基礎(chǔ)上新增自己的特性而產(chǎn)生新類的過程稱為在已有類的基礎(chǔ)上新增自己的特性而產(chǎn)生新類的過程稱為派生派生。3.被繼承的已有類稱為被繼承的已有類稱為基類基類(父類)。(父類)。4.派生出的新
3、類稱為派生出的新類稱為派生類派生類(子類子類)。5.直接父類、直接父類、直接直接子類;間接父類、子類;間接父類、間接間接子類子類派生類的定義與相關(guān)概念派生類的定義與相關(guān)概念派生(繼承)的內(nèi)部實現(xiàn)過程:派生(繼承)的內(nèi)部實現(xiàn)過程: 添加新成員添加新成員 吸收除構(gòu)造、析構(gòu)吸收除構(gòu)造、析構(gòu)函數(shù)外基類成員函數(shù)外基類成員 改造基類成員改造基類成員派生類的定義與相關(guān)概念派生類的定義與相關(guān)概念描述平面的一個點 矩形定義簡單實例:簡單實例:class pointpublic:point(int a,int b)x=a,y=b;int getx()int gety()void moveto(int a,int
4、b )private:int x,int y;class rectangle:public pointpublic:public retangle(int x,int y, int width,int heigth):point(x,y)w=width;h=height;privated:int w,h;派生類的定義與相關(guān)概念派生類的定義與相關(guān)概念基類與派生類的對應(yīng)關(guān)系基類與派生類的對應(yīng)關(guān)系:1.單繼承:派生類只從一個基類派生。2.多繼承:派生類從多個基類派生。3.多重派生:由一個基類派生出多個不同的派生類。4.多層派生:派生類又作為基類,繼續(xù)派生新的類。 簡化的繼承體系圖簡化的繼承體系圖返返
5、 回回三種基本繼承方式三種基本繼承方式1. 公有繼承公有繼承(public)1) 基類的public和protected成員的訪問屬性在派生類中保持不變;基類的private成員不可訪問(類內(nèi)類內(nèi)) 2) 派生類的對象只能訪問基類的public成員(類外類外) class Apublic:int x;A(int a,int b)x=a;u=b;void prt() coutpublic x=: xendl;private:int u; 舉例舉例 第一步:定義基類:第一步:定義基類:舉例舉例 第二第二 步:定義派生類步:定義派生類class B:public Apublic: B(int a,i
6、nt b,int c):A(a,b)y=c; int y; void prt() coutA:x= :A:xendl;A:prt(); /cout private base A:u=A:uendl;cout B:y=:yendl;此行錯誤!此行錯誤!舉例舉例 第三步:使用派生類第三步:使用派生類void main()B b(1,2,3);b.prt();/coutb.uendl;運行結(jié)果:運行結(jié)果:A:x= :1public x=: 1 B:y=:31Press any key to continueError!不可直接輸出u.1)派生類中:基類public和protected成員變成priv
7、ate成員;基類private成員不可訪問。2)通過派生類的對象不能訪問基類中的任何成員2. 私有繼承私有繼承(private)如何理解?類外的問題class Apublic:int x;A(int a,int b)x=a;u=b;void prt() coutpublic x=: xendl;private:int u;舉例舉例 第一步:定義基類:第一步:定義基類:舉例舉例 第二第二 步:定義派生類步:定義派生類class B:private Apublic: B(int a,int b,int c):A(a,b)y=c; int y; void prt() coutA:x= :A:xend
8、l;A:prt();cout B:y=:yendl;舉例舉例 第三步:使用派生類第三步:使用派生類void main()B b(1,2,3);b.prt();/coutb.xendl;運行結(jié)果:運行結(jié)果:A:x= :1public x=: 1 B:y=:31Press any key to continue私有數(shù)據(jù),不可直接輸出b.3. 保護(hù)保護(hù)繼承繼承(public)1) 派生類中:基類的public和protected成員變成protected成員;基類的private成員不可訪問2) 派生類的對象不能訪問基類中的任何成員protected 成員舉例成員舉例class A protecte
9、d: int x;int main( ) A a; /a.X=5; 錯誤protected 繼承class Apublic: int x void show_private()coutprivate of As y=y; void show_proteced()coutprotected of As z=z;private: int y; protected: int z;class B : protected Apublic :void out_base_public()coutx=:xendl;/void out_base_private()couty=:yendl; Error!void
10、 out_base_proteced()coutz=:zendl;void main()B b;/ b.x=19; Errror/ b.y=19; Error/ b.z=19; Errorb.out_base_public();b.out_base_proteced();如何訪問如何訪問A中的中的X、y、z?如何輸出如何輸出A中的中的私有成員私有成員?間接的方式間接的方式三種繼承方式之間的比較三種繼承方式之間的比較返返 回回派生類的構(gòu)造與析構(gòu)函數(shù)派生類的構(gòu)造與析構(gòu)函數(shù)一、構(gòu)造函數(shù)一、構(gòu)造函數(shù)1. 基類的構(gòu)造函數(shù)不被繼承,需要在派生類中自行聲明2. 初始化完成:1. 基類成員:基類構(gòu)造函數(shù)完成2
11、. 內(nèi)嵌對象成員3. 新增成員順序的思考:順序的思考:有它的現(xiàn)實有它的現(xiàn)實原形么?原形么?格式:格式:派生類名:派生類名(參數(shù)總表):基類名1(參數(shù)), 基類名2(參數(shù)), .基類名n(參數(shù)),內(nèi)嵌對象1(參數(shù))內(nèi)嵌對象n(參數(shù))本類成員初始化賦值語句;派生類的構(gòu)造函數(shù)派生類的構(gòu)造函數(shù)注意:注意:參數(shù)的順序不重要參數(shù)的順序不重要對比組合類的對比組合類的構(gòu)造函數(shù)構(gòu)造函數(shù)構(gòu)造函數(shù)的調(diào)用次序構(gòu)造函數(shù)的調(diào)用次序1.調(diào)用基類構(gòu)造函數(shù),調(diào)用順序按照它們被繼承時聲明的順序(從左向右)。2.調(diào)用成員對象的構(gòu)造函數(shù),調(diào)用順序按照它們在類中聲明的順序。3.派生類的構(gòu)造函數(shù)完成新增成員的初始化。注意注意:派生類的析
12、構(gòu)函數(shù)的調(diào)用次序與構(gòu)造函數(shù)正:派生類的析構(gòu)函數(shù)的調(diào)用次序與構(gòu)造函數(shù)正好相反好相反為什么?舉例舉例:討論構(gòu)造函數(shù)的調(diào)用次序問題討論構(gòu)造函數(shù)的調(diào)用次序問題class B1/基類B1,構(gòu)造函數(shù)有參數(shù)public:B1(int i) coutconstructing B1 iendl;class B2/基類B2,構(gòu)造函數(shù)有參數(shù)public:B2(int j) coutconstructing B2 jendl;class B3/基類B3,構(gòu)造函數(shù)無參數(shù)public:B3( )coutconstructing B3 *endl;class C: public B2, public B1, public
13、B3 public:C(int a, int b, int c, int d): B1(a),memberB2(d),memberB1(c),B2(b) private:B1 memberB1;B2 memberB2;B3 memberB3;void main( ) C obj(1,2,3,4);認(rèn)真思考并回答其輸出結(jié)果?constructing B2 2constructing B1 1constructing B3 *constructing B1 3constructing B2 4constructing B3 *Press any key to continue對構(gòu)造函數(shù)調(diào)用的討論對
14、構(gòu)造函數(shù)調(diào)用的討論1. 基類采用缺省構(gòu)造函數(shù)時:派生類構(gòu)造函數(shù)可以調(diào)用基類缺省構(gòu)造函數(shù)。2. 基類聲明帶形參的構(gòu)造函數(shù)時,派生類傳遞參數(shù)給基類構(gòu)造函數(shù),完成基類成員的初始化1. 自定義缺省構(gòu)造函數(shù):1.無參數(shù) 2.帶缺省值2. 系統(tǒng)默認(rèn)構(gòu)造函數(shù)兩種情形兩種情形二、析構(gòu)函數(shù)二、析構(gòu)函數(shù)1.析構(gòu)函數(shù)也不被繼承,派生類自行聲明2.聲明方法與一般(無繼承關(guān)系時)類的析構(gòu)函數(shù)相同3.不需要顯式地調(diào)用基類的析構(gòu)函數(shù),系統(tǒng)會自動隱式調(diào)用和組合類相似二、析構(gòu)函數(shù)二、析構(gòu)函數(shù)1.析構(gòu)函數(shù)的調(diào)用次序與構(gòu)造函數(shù)相反 2.自定義析構(gòu)函數(shù)主要完成動態(tài)分配內(nèi)存對象的釋放舉例:舉例:class B1/基類B1聲明publi
15、c: B1(int i)coutconstructing B1 iendl; B1() coutdestructing B1 endl;class B2/基類B2聲明public: B2(int j)coutconstructing B2 jendl; B2() coutdestructing B2 endl;class B3/基類B3聲明public: B3()coutconstructing B3 *endl; B3() coutdestructing B3 endl;class C: public B2, public B1, public B3public: C(int a, int
16、b, int c, int d): B1(a),memberB2(d),memberB1(c),B2(b)private:B1 memberB1;B2 memberB2;B3 memberB3;void main()C obj(1,2,3,4); 輸出結(jié)果:輸出結(jié)果:Constucting B2 2Constucting B1 1Constucting B3 *Constucting B1 3Constucting B2 4Constucting B3 *Destructing B3Destructing B2Destructing B1Destructing B3Destructing B1
17、Destructing B2返返 回回派生類的成員標(biāo)示與訪問派生類的成員標(biāo)示與訪問問題:問題:1.當(dāng)派生類與基類中有相同成員時,如何標(biāo)示與訪問不同類中定義的成員?舉例:舉例:class B1 public: int nV;void fun( );class D1: public B1 public:int nV;void fun ( )如何訪問如何訪問D1類中、對象中成員?類中、對象中成員?看下頁派生類的成員標(biāo)示與訪問派生類的成員標(biāo)示與訪問同名覆蓋原則同名覆蓋原則當(dāng)派生類與基類中有相同成員時:1.若未強行指名,則通過派生類對象使用的是派生類中的同名成員。2.如要通過派生類對象訪問基類中被覆蓋的
18、同名成員,應(yīng)使用基類名限定。void main( ) D1 d1;d1.nV=1; /對象名.成員名標(biāo)識, 訪問D1類成員,同名覆蓋d1.fun( ); d1.B1:nV=2;/作用域分辨符標(biāo)識, 訪問基類B1成員d1.B1:fun( );派生類的成員標(biāo)示與訪問派生類的成員標(biāo)示與訪問消除二義性消除二義性 2.當(dāng)多個直接基類中都從某一間接基類繼承共同成員時如何標(biāo)示和訪問?(參見下頁圖)(參見下頁圖)問題:問題:問題越來越問題越來越復(fù)雜啦!復(fù)雜啦!看下頁Class B0Public:Int nvVoid fun()class B1:public B0public: int nV1;void fun
19、1( );class B2:public B0 public:int nV2;void fun2( );class D1: public B1,public B2 public:int nV;void fun*( )派生類的成員標(biāo)示與訪問派生類的成員標(biāo)示與訪問解決解決二義性問題 通過直接基類,使用作用域運算符來訪問不同類中的成員參照上頁圖示參照上頁圖示 D1.B1:nv=1; D1.B2:nv=2; 聲明虛基類(下節(jié)介紹)返返 回回虛基類虛基類1. 虛基類的引入:用于直接基類有共同基類的場合,2. 防止多次初始化基類成員,實現(xiàn)維護(hù)一份拷貝3. 聲明:繼承時以virtual修飾說明基類例:cla
20、ss B1:virtual public B注意:在第一級繼承時就要將共同基類設(shè)計為虛基類。注意:在第一級繼承時就要將共同基類設(shè)計為虛基類。下頁舉例虛基類舉例:虛基類舉例:class B0/聲明基類B0public:/外部接口int nV;void fun( )coutMember of B0endl;class B1: virtual public B0 /B0為虛基類public:/新增外部接口int nV1;class B2: virtual public B0 /B0為虛基類派生B2類 public:/新增外部接口int nV2;class D1: public B1, public
21、B2/派生類D1聲明 public:/新增外部接口int nVd;void fund( )coutMember of D1endl;存儲映象存儲映象虛基虛基類類void main( )/程序主函數(shù) D1 d1;/聲明D1類對象d1d1.nV=2;/使用直接基類數(shù)據(jù)成員d1.fun( );/ 使用直接基類函數(shù)成員使之虛的思想使之虛的思想虛基類及其派生類構(gòu)造函數(shù)虛基類及其派生類構(gòu)造函數(shù)1.建立對象的類稱為最遠(yuǎn)派生類2.虛基類成員由最遠(yuǎn)派生類構(gòu)造函數(shù)通過虛基類構(gòu)造函數(shù)進(jìn)行初始化虛基類及其派生類構(gòu)造函數(shù)虛基類及其派生類構(gòu)造函數(shù)3.派生類在構(gòu)造函數(shù)的成員初始化表中調(diào)用虛基類的構(gòu)造函數(shù)。否則調(diào)用該虛基類的
22、缺省構(gòu)造函數(shù)4.C保證最遠(yuǎn)(當(dāng)前)派生類的構(gòu)造函數(shù)調(diào)用虛基類的構(gòu)造函數(shù),忽略其它父類對虛基類構(gòu)造函數(shù)的調(diào)用避免多次構(gòu)造class B0/聲明基類B0 public:/外部接口 B0(int n) nV=n; int nV; void fun( );class B1: virtual public B0 public:B1(int a) : B0(a) int nV1;class B2: virtual public B0 public:B2(int a) : B0(a) int nV2;直接基類與間接基直接基類與間接基類定義類定義class D1: public B1, public B2public:D1(int a) : B0(a), B1(a), B2(a)int nVd;void fund( )coutMember of D1endl;void main( )D1 d1(9);d1.nV=2;d1.fun( );派生類定義派生類定義返返 回回賦值兼容原則賦值兼容原則一個公有派生類的對象在使用上可以被當(dāng)作基類的對象,反之則禁止。具體表現(xiàn)在:1. 派生類的對象可以被賦值給基類對象2. 派生類的對象可以初始化基類的引用3. 指向基類的指針也可以指向派生類的對象對比類型轉(zhuǎn)換在Vc等可視化開發(fā)工具中大量使用!舉例舉例:
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 店租解約合同范本
- 宣傳品紙杯制作合同范本
- 幕墻簡易合同范本
- 綠通合同范本
- 太陽系六年級科學(xué)下冊
- 化學(xué)學(xué)業(yè)水平考試復(fù)習(xí)(全套)
- 醫(yī)療產(chǎn)品合同范本
- 碎石生產(chǎn)合同范本
- 2024年小型風(fēng)力發(fā)電市場分析:小型風(fēng)力發(fā)電國內(nèi)市場規(guī)模為46億元
- 房產(chǎn)分三方合同范本
- 傳染病首診醫(yī)生負(fù)責(zé)制度傳染病首診負(fù)責(zé)制
- 兒科住院超過30天持續(xù)改進(jìn)PDCA案例
- 現(xiàn)澆鋼筋混凝土水池施工方法
- 胸腰椎壓縮骨折中醫(yī)治療難點及解決思路和措施
- 氣管切開術(shù)及環(huán)甲膜穿刺術(shù)演示文稿
- 中華詩詞學(xué)會會員登記表上網(wǎng)
- 煙葉分級知識考試題庫(含答案)
- 中建三局施工現(xiàn)場安全防護(hù)標(biāo)準(zhǔn)化圖冊
- 變應(yīng)性支氣管肺曲霉病ABPA中國專家共識
- 結(jié)節(jié)病課件完整版
- 用電安全專項檢查表
評論
0/150
提交評論