![cc模塊10派生類與繼承_第1頁](http://file4.renrendoc.com/view/1b2b7d260b4bce1147cbbcc9954dd456/1b2b7d260b4bce1147cbbcc9954dd4561.gif)
![cc模塊10派生類與繼承_第2頁](http://file4.renrendoc.com/view/1b2b7d260b4bce1147cbbcc9954dd456/1b2b7d260b4bce1147cbbcc9954dd4562.gif)
![cc模塊10派生類與繼承_第3頁](http://file4.renrendoc.com/view/1b2b7d260b4bce1147cbbcc9954dd456/1b2b7d260b4bce1147cbbcc9954dd4563.gif)
![cc模塊10派生類與繼承_第4頁](http://file4.renrendoc.com/view/1b2b7d260b4bce1147cbbcc9954dd456/1b2b7d260b4bce1147cbbcc9954dd4564.gif)
![cc模塊10派生類與繼承_第5頁](http://file4.renrendoc.com/view/1b2b7d260b4bce1147cbbcc9954dd456/1b2b7d260b4bce1147cbbcc9954dd4565.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、模塊 10 派生類與繼承高級語言程序設(shè)計(jì)基礎(chǔ)(C&C+)2主要內(nèi)容1 繼承與派生的概念2 派生類的構(gòu)成3 派生類的繼承方式4 派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)5 多繼承6 虛基類31 繼承與派生的概念保持已有類的特性而構(gòu)造新類的過程稱為繼承。在已有類的基礎(chǔ)上新增自己的特性而產(chǎn)生新類的過程稱為派生。被繼承的已有類稱為基類(或父類)。派生出的新類稱為派生類。4繼承與派生問題舉例5繼承與派生問題舉例6繼承與派生的目的繼承的目的:實(shí)現(xiàn)代碼重用。派生的目的:當(dāng)新的問題出現(xiàn),原有程序無法解決(或不能完全解決)時,需要對原有程序進(jìn)行改造。7 派生類生成過程三個步驟:(1)吸收基類成員:除構(gòu)造函數(shù)和析構(gòu)函數(shù)外,新類
2、將基類的公有成員全部接受。(2)改造基類成員:在新類中通過繼承方式來控制繼承來成員的訪問權(quán)限;在新類中定義與基類中同名的數(shù)據(jù)或函數(shù),即“同名覆蓋”,實(shí)現(xiàn)以新成員取代基類的成員;(3)添加新的成員:包括數(shù)據(jù)和函數(shù)。8 2 派生類的構(gòu)成Person類char sname;int age;char sex;void display()基類數(shù)據(jù)成員成員函數(shù)Student類char sname;int age;char sex;void display()int num;int class;void display()繼承派生類新增基類和派生類的關(guān)系9基類與派生類的對應(yīng)關(guān)系單繼承派生類只從一個基類派生。
3、多繼承派生類從多個基類派生。多重派生由一個基類派生出多個不同的派生類。多層派生派生類又作為基類,繼續(xù)派生新的類。103 派生類的繼承方式不同繼承方式的影響主要體現(xiàn)在:派生類成員對基類成員的訪問權(quán)限通過派生類對象對基類成員的訪問權(quán)限三種繼承方式公有繼承 public私有繼承 private保護(hù)繼承 protected11必須在類聲明的頭部指明它的基類以及繼承方式(基類成員的訪問屬性),如public、private或者protected;繼承方式必須且只能選擇一個,缺省默認(rèn)為private;派生類的聲明方式12class : ;例: class A/ A類的成員 ;class B: public
4、 A / B類的成員 ;單繼承定義格式13基類的成員可以有public(公有)、protected(保護(hù))和private(私有)三種訪問屬性;基類的自身成員可以訪問基類中任何其它成員,但是基類的對象只能訪問基類的公有成員;3 派生類的繼承方式14在派生類中,從基類繼承來的成員,其訪問屬性由繼承方式控制;不同的繼承方式使得具有不同訪問屬性的基類成員在派生類中的訪問屬性也不同:包括派生類的新增成員對繼承來的基類成員的訪問,以及派生類外部,通過派生類對象對繼承來的基類成員的訪問。3 派生類的繼承方式15公有繼承(public)基類的public和protected成員的訪問屬性在派生類中保持不變,
5、但基類的private成員不可直接訪問。派生類中的成員函數(shù)可以直接訪問基類中的public和protected成員,但不能直接訪問基類的private成員。通過派生類的對象只能訪問基類的public成員。例1 從point類公有派生出circle類。16私有繼承(private)基類的public和protected成員都以private身份出現(xiàn)在派生類中,但基類的private成員不可直接訪問。派生類中的成員函數(shù)可以直接訪問基類中的public和protected成員,但不能直接訪問基類的private成員。通過派生類的對象不能直接訪問基類中的任何成員。例2 將例1中的公有繼承改成私有繼承。
6、17保護(hù)繼承(protected)基類的public和protected成員都以protected身份出現(xiàn)在派生類中,但基類的private成員不可直接訪問。派生類中的成員函數(shù)可以直接訪問基類中的public和protected成員,但不能直接訪問基類的private成員。通過派生類的對象不能直接訪問基類中的任何成員。18關(guān)于訪問屬性:繼承方式基類成員在派生類中的訪問屬性派生類中的成員函數(shù)派生類的對象公有繼承public protected privatepublic protected不可直接訪問可訪問基類中的公有成員和保護(hù)成員可訪問基類和派生類中的公有成員私有繼承public protec
7、ted privateprivate private不可直接訪問可訪問基類中的公有成員和保護(hù)成員不能訪問基類中的所有成員保護(hù)繼承publicprotected privateprotected protected不可直接訪問可訪問基類中的公有成員和保護(hù)成員不能訪問基類中的所有成員194 派生類的構(gòu)造、析構(gòu)函數(shù) 派生類的構(gòu)造函數(shù)基類的構(gòu)造函數(shù)不被繼承,派生類中需要聲明自己的構(gòu)造函數(shù)。聲明構(gòu)造函數(shù)時,只需要對本類中新增成員進(jìn)行初始化,對繼承來的基類成員的初始化,自動調(diào)用基類構(gòu)造函數(shù)完成。派生類的構(gòu)造函數(shù)需要給基類的構(gòu)造函數(shù)傳遞參數(shù)20 派生類的構(gòu)造函數(shù)在兩種情況下,必須定義派生類的構(gòu)造函數(shù):派生類
8、本身需要構(gòu)造函數(shù);在定義派生類對象時,其相應(yīng)的基類對象需調(diào)用帶有參數(shù)的構(gòu)造函數(shù)。21簡單的派生類只有一個基類,只有一級派生,且派生類的數(shù)據(jù)成員不包含其它類的對象;建立一個派生類對象時,構(gòu)造函數(shù)的執(zhí)行順序是:(1) 調(diào)用基類的構(gòu)造函數(shù);(2) 執(zhí)行派生類的構(gòu)造函數(shù)體中的內(nèi)容。簡單派生類的構(gòu)造函數(shù)22簡單派生類的構(gòu)造函數(shù)派生類名:派生類名(基類所需的形參,本類成員所需的形參):基類名(參數(shù)表) 本類成員初始化賦值語句;例3 簡單派生類的構(gòu)造函數(shù)。23如果一個類的數(shù)據(jù)成員包含其它類的對象,則該對象就稱為內(nèi)嵌對象成員;內(nèi)嵌對象成員的初始化, 是在建立派生類對象時通過調(diào)用派生類的構(gòu)造函數(shù)實(shí)現(xiàn);有內(nèi)嵌對象
9、成員的派生類的構(gòu)造函數(shù)的語法形式: 派生類名:派生類名(總參數(shù)表):基類名(參數(shù)表), 子對象名(參數(shù)表) / 派生類中新增成員的初始化; 有內(nèi)嵌對象成員時派生類的構(gòu)造函數(shù)24參數(shù)總表:包括初始化基類數(shù)據(jù)、新增對象數(shù)據(jù)及新增一般成員所需的全部數(shù)據(jù)。建立派生類對象時,構(gòu)造函數(shù)的執(zhí)行順序是:(1) 調(diào)用基類的構(gòu)造函數(shù);(2) 調(diào)用子對象的構(gòu)造函數(shù);(3) 執(zhí)行派生類的構(gòu)造函數(shù)體中的內(nèi)容。例4 包含子對象的派生類的構(gòu)造函數(shù)。有內(nèi)嵌對象成員時派生類的構(gòu)造函數(shù)25派生類構(gòu)造函數(shù)的特殊形式(1) 派生類的構(gòu)造函數(shù)可以是空函數(shù);(2) 若在基類中沒定義構(gòu)造函數(shù)或定義了無參構(gòu)造函數(shù),則派生類構(gòu)造函數(shù)的定義就不
10、寫基類的構(gòu)造函數(shù)。26派生類的析構(gòu)函數(shù)在派生類中是否要定義析構(gòu)函數(shù)與它所屬的基類無關(guān);派生類析構(gòu)函數(shù)的定義與無繼承關(guān)系的類的析構(gòu)函數(shù)定義相同;系統(tǒng)會自動調(diào)用基類及對象成員的析構(gòu)函數(shù)來對基類和對象成員進(jìn)行清理,但執(zhí)行次序和構(gòu)造函數(shù)正好相反(先派生類,再基類對象,后基類)。例5 給出下列程序的輸出結(jié)果。275 多繼承一個派生類由多個基類派生而來,這種情況稱為多繼承。base1base2base3derive1derive2derive3derive428聲明多繼承的方法定義多繼承派生類時,要指出它的所有基類名及繼承方式;聲明形式: class 派生類名:繼承方式1 基類名1,繼承方式2 基類名2,
11、 繼承方式n 基類名n 派生類新增成員; 多繼承中,公有派生和私有派生對于基類成員在派生類中的可訪問性與單繼承的規(guī)則相同。29多繼承派生類的構(gòu)造函數(shù)多繼承派生類的構(gòu)造函數(shù)定義與單繼承相似,但幾個基類的構(gòu)造函數(shù)之間用“,”分隔。形式如下:派生類名:派生類名(參數(shù)總表):基類1(參數(shù)表1),基類n(參數(shù)表n),對象成員1(參數(shù)表1),對象成員n(參數(shù)表n) /派生類新增成員的初始化語句; 30多繼承派生類的構(gòu)造函數(shù)派生類構(gòu)造函數(shù)要完成新增構(gòu)造函數(shù)的調(diào)用以及所有基類構(gòu)造函數(shù)的調(diào)用;參數(shù)總表包含其后的各個分參數(shù)表,即構(gòu)造函數(shù)的參數(shù)必須包含完成所有基類初始化以及內(nèi)嵌對象初始化所需要所有參數(shù),即參數(shù)總是分
12、配給后面的參數(shù)表1、參數(shù)表2,。31 多繼承構(gòu)造函數(shù)的執(zhí)行順序 先祖先(基類),調(diào)用基類構(gòu)造函數(shù),調(diào)用順序按照它們被繼承時說明的順序(從左向右); 再客人(內(nèi)嵌對象成員),調(diào)用內(nèi)嵌對象的構(gòu)造函數(shù),調(diào)用順序按照它們在類中說明的順序; 后自己(派生類),執(zhí)行派生類構(gòu)造函數(shù)體中的內(nèi)容 。32例6 多繼承構(gòu)造函數(shù)舉例#include 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
13、/基類B3,構(gòu)造函數(shù)無參數(shù)public:B3()coutconstructing B3 *endl;class C: public B2, public B1, public 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); 運(yùn)行結(jié)果:constructing B2 2constructing B1 1const
14、ructing B3 *constructing B1 3constructing B2 4constructing B3 *3334C(int a,int b,int c,int d):B1(a),memberB2(d),memberB1(c),B2(b) 構(gòu)造函數(shù)的參數(shù)表中給出了基類及內(nèi)嵌成員對象所需的全部參數(shù);在冒號之后調(diào)用各個基類及內(nèi)嵌對象的構(gòu)造函數(shù);基類構(gòu)造函數(shù)的執(zhí)行順序按照它們在派生類中聲明繼承的順序(B2,B1,B3 );內(nèi)嵌對象構(gòu)造函數(shù)的執(zhí)行順序也按照其在派生類中聲明的順序( B1,B2,B3 ) 。例6 多繼承構(gòu)造函數(shù)舉例35需要注意:1、在類C的構(gòu)造函數(shù)中,沒有列出全部基類
15、和內(nèi)嵌成員對象,因B3類只有默認(rèn)構(gòu)造函數(shù),不需傳遞參數(shù),故基類B3以及B3類成員對象memberB3不必列出;2、在類C的構(gòu)造函數(shù)中,基類名和成員對象名的順序可隨意。派生類構(gòu)造函數(shù)體為空,實(shí)際上它只起到傳遞參數(shù)和調(diào)用基類和內(nèi)嵌對象構(gòu)造函數(shù)的作用。例6 多繼承構(gòu)造函數(shù)舉例36多繼承的析構(gòu)函數(shù)析構(gòu)函數(shù)也不被繼承,派生類自行聲明聲明方法與一般(無繼承關(guān)系時)類的析構(gòu)函數(shù)相同。不需要顯式地調(diào)用基類的析構(gòu)函數(shù),系統(tǒng)會自動隱式調(diào)用。析構(gòu)函數(shù)的調(diào)用次序與構(gòu)造函數(shù)相反。例7 多繼承派生類的構(gòu)造函數(shù)與析構(gòu)函數(shù)。37例7 派生類析構(gòu)函數(shù)舉例#include class B1/基類B1聲明 public:B1(in
16、t 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 b, int c, in
17、t d): B1(a),memberB2(d),memberB1(c),B2(b)private:B1 memberB1;B2 memberB2;B3 memberB3;void main()C obj(1,2,3,4); 3839運(yùn)行結(jié)果constructing B2 2constructing B1 1constructing B3 *constructing B1 3constructing B2 4constructing B3 *destructing B3destructing B2destructing B1destructing B3destructing B1destruct
18、ing B240同名隱藏規(guī)則當(dāng)派生類與基類中有相同成員時:若未強(qiáng)行指名,則通過派生類對象使用的是派生類中的同名成員。如要通過派生類對象訪問基類中被覆蓋的同名成員,應(yīng)使用基類名限定。41例8 多重繼承同名隱藏舉例#include 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, public B2 public:int nV;/同名數(shù)據(jù)成員v
19、oid fun()cout“Member of D1”endl; 同名函數(shù)成員;void main()D1 d1;d1.nV=1; /對象名.成員名標(biāo)識, 訪問D1類成員d1.fun(); d1.B1:nV=2;/作用域分辨符標(biāo)識, 訪問基類B1成員d1.B1:fun();d1.B2:nV=3;/作用域分辨符標(biāo)識, 訪問基類B2成員d1.B2:fun();4243二義性問題在多繼承時,基類與派生類之間,或基類之間出現(xiàn)同名成員時,將出現(xiàn)訪問時的二義性(不確定性)采用虛函數(shù)或同名隱藏規(guī)則來解決。當(dāng)派生類由多個基類派生,而這些基類又從同一個基類派生,則在訪問此共同基類中的成員時,將產(chǎn)生二義性采用虛基
20、類來解決。44二義性問題舉例(一)class A public: 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(); 無二義性(同名覆蓋)45二義性的解決方法解決方法一:用類名來限定c1.A:f() 或 c1.B:f()解決方法二:同名覆蓋在C 中聲明一個同名成員函數(shù)f(),f()再根據(jù)需要調(diào)用 A:f() 或 B:f()46二義性問題舉例(二)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 d;派生類C的對象的存儲結(jié)構(gòu)示意圖:bb1bb2dB類成員B類成員B1類成員B2類成員C類對象有二義性:C c;c.bc.B:b無二義性:c.B1:bc.B2:b47486 虛基類虛基類的引入用于有共同基類的場合聲明以virtual修飾說明基類例:class B1:virtual
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 無店鋪零售服務(wù)項(xiàng)目風(fēng)險識別與評估綜合報(bào)告
- 2025年刮墨刀項(xiàng)目效益評估報(bào)告
- 辦公用地申請書
- DB2201-T 52-2023 枝角類室內(nèi)高密度培養(yǎng)技術(shù)規(guī)范
- 100以內(nèi)加減乘除能力提升練習(xí)活動1000題(可打?。?/a>
- 一建《建設(shè)工程項(xiàng)目管理》試題庫資料練習(xí)含【答案】卷32
- 知識產(chǎn)權(quán)在醫(yī)療科技創(chuàng)新中的保障作用
- 校園綠化與生態(tài)教育的融合創(chuàng)新
- 電子商務(wù)平臺數(shù)據(jù)監(jiān)測全解析
- 電機(jī)控制技術(shù)在航空航天領(lǐng)域的商業(yè)價值
- 中國銀行(香港)有限公司招聘筆試真題2023
- 15萬噸水廠安裝工程施工組織設(shè)計(jì)方案
- 超級蘆竹種植項(xiàng)目可行性研究報(bào)告-具有高經(jīng)濟(jì)價值和廣泛應(yīng)用前景
- 自動體外除顫器項(xiàng)目創(chuàng)業(yè)計(jì)劃書
- 養(yǎng)老機(jī)構(gòu)績效考核及獎勵制度
- 2024年越南煤礦設(shè)備再制造行業(yè)現(xiàn)狀及前景分析2024-2030
- 長塘水庫工程環(huán)評報(bào)告書
- 病案管理質(zhì)量控制指標(biāo)檢查要點(diǎn)
- DL-T5001-2014火力發(fā)電廠工程測量技術(shù)規(guī)程
- 平行四邊形的判定(27張)-完整課件
- 居民住宅小區(qū)電力配置規(guī)范
評論
0/150
提交評論