版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、 繼承(inheritance): 繼承是面向?qū)ο蟪绦蛟O(shè)計(jì)使代碼可以復(fù)用的最重要的手段,它允許程序員在保持原有類特性的基礎(chǔ)上進(jìn)行擴(kuò)展,增加功能。這樣產(chǎn)生新的類,稱派生類。繼承呈現(xiàn)了面向?qū)ο蟪绦蛟O(shè)計(jì)的層次結(jié)構(gòu)。體現(xiàn)了由簡單到復(fù)雜的認(rèn)識(shí)過程。繼承與派生繼承(inheritance)可對(duì)類(class)分層, C+通過類的派生(class derivation)的機(jī)制來支持繼承。被繼承的類稱為基類(base class)或超類(superclass),新的類為派生類(derived class)或(subclass)。 派生反映了事物之間的聯(lián)系,事物的共性與個(gè)性之間的關(guān)系。 派生與獨(dú)立設(shè)計(jì)若干相關(guān)的
2、類,前者工作量少,重復(fù)的部分可以從基類繼承來,不需要單獨(dú)編程實(shí)現(xiàn)代碼復(fù)用。 1繼承與派生的概念 虛基類多重繼承與派生類成員標(biāo)識(shí) 派生類應(yīng)用討論 派生類的構(gòu)造函數(shù)與析構(gòu)函數(shù) 繼承與派生2一、類的派生與繼承 二、公有派生與私有派生 繼承與派生的概念 3、派生類的定義格式:class 派生類名:訪問限定符 基類名1,訪問限定符 基類名2,訪問限定符 基類名nprivate:成員表1; /派生類增加或替代的私有成員public:成員表2; /派生類增加或替代的公有成員protected:成員表3;/派生類增加或替代的保護(hù)成員;/分號(hào)不可少 其中基類1,基類2,是已聲明的類。 在派生類定義的類體中給出的
3、成員稱為派生類成員,它們是新增加成員,它們給派生類添加了不同于基類的新的屬性和功能。派生類成員也包括取代基類成員的更新成員。一、類的派生與繼承 4基類1基類2基類n派生類1派生類2基類派生類1派生類2(a)多重繼承 (b)單繼承 多重繼承與單繼承 一個(gè)基類可以直接派生出多個(gè)派生類 派生類可以由多個(gè)基類共同派生出來,稱多重繼承。、多重繼承: 如果一個(gè)派生類可以同時(shí)有多個(gè)基類,稱為多重繼承(multiple-inheritance)。、單繼承: 派生類只有一個(gè)直接基類稱為單繼承(single-inheritance)。5 在派生過程中,派生出來的新類同樣可以作為基類再繼續(xù)派生出更新的類,依此類推形
4、成一個(gè)層次結(jié)構(gòu)。直接參與派生出某類稱為直接基類,而基類的基類,以及更深層的基類稱為間接基類。類族: 同時(shí)一個(gè)基類可以直接派生出多個(gè)派生類。這樣形成了一個(gè)相互關(guān)聯(lián)的類族。如MFC就是這樣的族類,它由一個(gè)CObject類派生出200個(gè)MFC類中的絕大多數(shù)。 、多層次繼承:一、類的派生與繼承 6)、吸收基類的成員 )、改造基類成員 )、發(fā)展新成員 )、重寫構(gòu)造函數(shù)與析構(gòu)函數(shù) 不論是數(shù)據(jù)成員,還是函數(shù)成員,除構(gòu)造函數(shù)與析構(gòu)函數(shù)外全盤接收 聲明一個(gè)和某基類成員同名的新成員,派生類中的新成員就屏蔽了基類同名成員稱為同名覆蓋(override) 派生類新成員必須與基類成員不同名,它的加入保證派生類在功能上有
5、所發(fā)展。 、派生編程步驟:編制派生類時(shí)可分四步7注意:在第二步中,新成員如是成員函數(shù),參數(shù)表也必須一樣,否則是重載。第三步中,獨(dú)有的新成員才是繼承與派生的核心特征。第四步是重寫構(gòu)造函數(shù)與析構(gòu)函數(shù),派生類不繼承這兩種函數(shù)。不管原來的函數(shù)是否可用一律重寫可免出錯(cuò)。86、訪問控制: 亦稱為繼承方式,是對(duì)基類成員進(jìn)一步的限制,訪問控制有三種: 公有(public)方式,亦稱公有繼承 保護(hù)(protected)方式,亦稱保護(hù)繼承 私有(private)方式, 亦稱私有繼承。 不可直接訪問 不可直接訪問 private 不可直接訪問 private protected 不可直接訪問 private pub
6、lic 私有派生 不可直接訪問 不可直接訪問 private 不可直接訪問 protected protected 可直接訪問 public public 公有派生 在派生類對(duì)象外訪問派生類對(duì)象的基類成員 在派生類中對(duì)基類成員的訪問限定 基類中的訪問限定 派生方式 9例題:分析下列程序的訪問權(quán)限,并回答所提出的問題#includeclass Apublic :void f1();protected:int j1;private:int i1;class B:public Apublic:void f2();protected:int j2;private:int i2;class C:publ
7、ic Bpublic:void f3();回答下列問題:1、派生類B中成員函數(shù)f2()能否訪問基類A 中的成員:f1(),i1,j1?2、派生類B的對(duì)象能否訪問基類A 中的成員:f1(),i1,j1?3、派生類C中的成員函數(shù)能否訪問基類B 中的成員:f2(),i2,j2?101、派生類構(gòu)造函數(shù)的定義:派生類名:派生類名(參數(shù)總表):基類名1(參數(shù)名表1),基類名2(參數(shù)名表2),基類名n(參數(shù)名表n),成員對(duì)象名1(成員對(duì)象參數(shù)名表1),成員對(duì)象名m(成員對(duì)象參數(shù)名表m) /派生類新增成員的初始化; /所列出的成員對(duì)象名全部為新增成員對(duì)象的名字注意: 1)在構(gòu)造函數(shù)的聲明中,冒號(hào)及冒號(hào)以后部分
8、必須略去。 2)基類名僅指直接基類,寫了底層基類,編譯器認(rèn)為出錯(cuò)。 3)冒號(hào)后的基類名,成員對(duì)象名的次序可以隨意,這里的次序與調(diào)用次序無關(guān)。 派生類的構(gòu)造函數(shù)與析構(gòu)函數(shù) 112、派生類構(gòu)造函數(shù)各部分執(zhí)行次序: 1)調(diào)用基類構(gòu)造函數(shù),按它們?cè)谂缮惗x的先后順序,順序調(diào)用。 2)調(diào)用成員對(duì)象的構(gòu)造函數(shù),按它們?cè)陬惗x中聲明的先后順序,順序調(diào)用。3)派生類的構(gòu)造函數(shù)體中的操作。注意: 1)在派生類構(gòu)造函數(shù)中,只要基類不是使用無參的默認(rèn)構(gòu)造函數(shù)都要顯式給出基類名和參數(shù)表。 2)如果基類沒有定義構(gòu)造函數(shù),則派生類也可以不定義,全部采用系統(tǒng)給定的默認(rèn)構(gòu)造函數(shù)。 3)如果基類定義了帶有形參表的構(gòu)造函數(shù)時(shí),
9、派生類就應(yīng)當(dāng)定義構(gòu)造函數(shù)。123、析構(gòu)函數(shù): 析構(gòu)函數(shù)的功能是作善后處理工作。 派生類的析構(gòu)函數(shù)只需把派生類新增一般成員處理好就可以了,而對(duì)新增的成員對(duì)象和基類的善后工作,系統(tǒng)會(huì)自己調(diào)用成員對(duì)象和基類的析構(gòu)函數(shù)來完成。 析構(gòu)函數(shù)各部分執(zhí)行次序與構(gòu)造函數(shù)相反,首先對(duì)派生類新增一般成員析構(gòu),然后對(duì)新增對(duì)象成員析構(gòu),最后對(duì)基類成員析構(gòu)。13例題:分析下列程序 的輸出結(jié)果代碼一:#includeclass Apublic:A()a=0;cout“As default constructor called.n”;A(int i)a=i,;cout“As constructor called.n”);A(
10、)cout“ As destructor called.n”;void Print() const couta“,”int GetA()return a;private:int a;14class B:public Apublic:B ()b=0;cout“As default constructor called.n”;B(int I,int j,int k);B()cout“Bs destructor called.n”;void Print();private:int b;A aa;B:B(int I,int j,int k):A(i),aa(j)b=k;cout“Bs construc
11、tor called”;void B:;Print()A;:Print();coutb“,”aa.Geta()endl;void main()B bb2;bb0=B(1,2,5);bb1=3,4,7;for(int i=0;i2;i+)bbi.Print();15代碼二:#includeclass Mpublic:M()m1=m2=0;M(int I,int j)m1=I;m2=j;void print()coutm1“,”m2“,”;M()cout“Ms destructor called.n”;private:int m1,m2;class N:public Mpublic:N()n=0;
12、N(int I,int j,int k);void print()M:print();coutnendl;N()cout“Ns destructor calledn”;private:int n;N:N(int I,int j,int k):M(I,j),n(k)void mian()N n1(5,6,7);n2(-2,-3,-4);n1.print(),n2.print();16例題:由“人”類派生出“學(xué)生”類。我們希望基類和派生類共享相同的公有方法,因此,只能采用公有派生來實(shí)現(xiàn)。人類:enum Tsexmid,man,woman; class Personstring IdPerson;/
13、身份證號(hào),18位數(shù)字string Name;/姓名Tsex Sex; /性別int Birthday;/生日,格式1986年8月18日寫作19860818string HomeAddress;/家庭地址public:Person(string, string,Tsex,int, string);/構(gòu)造函數(shù) Person(); /默認(rèn)的構(gòu)造函數(shù) Person(); /析構(gòu)函數(shù)17void SetName(string); /修改名字string GetName()return Name; /提取名字void SetSex(Tsex sex)Sex=sex; /修改性別Tsex GetSex()r
14、eturn Sex; /提取性別void SetId(string id)IdPerson=id;/修改身份證號(hào)string GetId()return IdPerson; /提取身份證號(hào)void SetBirth(int birthday) Birthday=birthday; /修改生日int GetBirth()return Birthday; /提取生日void SetHomeAdd(string ); /修改住址string GetHomeAdd()return HomeAddress; /提取住址void PrintPersonInfo(); /輸出個(gè)人信息;/接口方法:18派生的
15、學(xué)生類:class Student:public Person /定義派生的學(xué)生類string NoStudent; /學(xué)號(hào)course cs30; /30門課程與成績public: Student(string id, string name,Tsex sex,int birthday, string homeadd, string nostud);/注意派生類構(gòu)造函數(shù)聲明方式 Student(); /默認(rèn)派生類構(gòu)造函數(shù) Student(); /派生類析構(gòu)函數(shù) SetCourse(string ,int); /課程設(shè)置 int GetCourse(string ); /查找成績 void P
16、rintStudentInfo(); /打印學(xué)生情況;struct course string coursename; int grade;19人學(xué)生(單繼承)教職工(單繼承)兼職教師(單繼承)教師(單繼承)行政人員(單繼承)工人(單繼承)研究生(單繼承)行政人員兼教師(多重繼承)在職研究生(多重繼承)研究生助教(多重繼承)學(xué)校人員與人繼承關(guān)系派生出來的新類同樣可以作為基類再繼續(xù)派生出更新的類,依此類推形成一個(gè)層次結(jié)構(gòu)。 多重繼承與派生類成員標(biāo)識(shí) 多重繼承實(shí)例:20 二義性問題:在上圖中,比如行政人員兼教師,在其基類教師中有一個(gè)“教職工編號(hào)”,另一基類行政人員中也有一個(gè)“教職工編號(hào)”,如果只講
17、教職工編號(hào)到底那是哪一個(gè)基類中的呢?或者這兩者是一回事?解決的方法:1)通常采用作用域分辨符“:”,進(jìn)行區(qū)別:基類名:成員名; /數(shù)據(jù)成員基類名:成員名(參數(shù)表); /函數(shù)成員2)引入”虛基類” 多重繼承與派生類成員標(biāo)識(shí) 21例題:分析下列程序的輸出結(jié)果#includeclass Apublic:A(int i)a=I;cout“con An”;void print()coutaendl;A()cout“des An”;private:int a;class B1:public Apublic :B1(int I,int j):A(i)b1=j;cout“con B1n”;void print
18、()A:print();coutb1ednl;B1()coutdes B1n”;private:int b1;class B2:public Apublic:B2(int I,int j):A(i)b2=j;cout“con B2n”;22void print()A:print();coutb2ednl;B2()coutdes B2n”;private:int b2;class C:public B1,B2public:C(int I,int j,int k,int l,int m):B1(I,j),B2(k,l),c(m)cout“con Cn”;void print()B1:print()
19、;B2:print();coutcendl;C()cout“des Cn”;private:int c;void main()C c1(1,2,3,4,5);c1.print();result:con A1con B1con Acon B2con c12345des Cdes B2des Ades B1des A23注意:virtual 關(guān)鍵字只對(duì)緊隨其后的基類名起作用:例如:class Student:virtual public Person.;class Employee:virtual public Person.;一、虛基類(virtual base class)定義:class 派
20、生類名:virtual 訪問限定符 基類類名.;或class 派生類名:訪問限定符 virtual 基類類名.;虛基類24例如:class Apublic:void f();protected:int a;class B:virtual public Aprotected:int b;class C:virtual public A protected:int c;class D:public B,public Cpublic:int g();private:int d;由于使用了虛基類,使得類A,類B,類C和類D之間的關(guān)系用DAG圖示法表示如下:Af(),aBb Cc Dg(),d25說明:
21、引進(jìn)虛基類后,派生類的對(duì)象中只有一個(gè)虛基類的子對(duì)象。當(dāng)一個(gè)類有虛基類時(shí),編譯系統(tǒng)將為該類的對(duì)象定義一個(gè)指針成員,讓它指向虛基類的子對(duì)象。該指針被稱為虛基類指針。上例中,各類的存儲(chǔ)結(jié)構(gòu)如下圖所示:BCAD虛基類指針26二、虛基類的構(gòu)造函數(shù) 如果一個(gè)派生類有一個(gè)直接或者間接的虛基類,那么派生類的構(gòu)造函數(shù)的成員初始化列表中必須列出對(duì)虛基類構(gòu)造函數(shù)的調(diào)用,如果未列出,則表示使用該虛基類的缺省構(gòu)造函數(shù)來初始化派生類對(duì)象中的虛基類子對(duì)象。 從虛基類直接或者間接繼承的派生類中的構(gòu)造函數(shù)的成員初始化列表中都要列出這個(gè)虛基類構(gòu)造函數(shù)的調(diào)用。但是,只有最后的派生類對(duì)象調(diào)用虛基類的構(gòu)造函數(shù),而該派生類的基類中所列出
22、的對(duì)這個(gè)虛基類的構(gòu)造函數(shù)的調(diào)用在執(zhí)行中被忽略。 在一個(gè)成員初始化列表中出現(xiàn)對(duì)虛基類和非虛基類構(gòu)造函數(shù)的調(diào)用,則虛基類的構(gòu)造函數(shù)先于非虛基類的構(gòu)造函數(shù)的執(zhí)行。27例題:分析下列程序的輸出結(jié)果#includeclass Apublic:A(const char *s)coutsendl;A();class B:virtual public Apublic:B(const char *s1,const char *s2):A(s1)couts2endl;class C:virsual public Apublic:C(const char *s1,const char *s2):A(s1)couts
23、2endl;class D:public B,public Cpublic:D(const char *s1,const char *s2,const *s3,const *s4):B(s1,s2),C(s1,s3),A(s1)couts4endl;28void main()D *ptr=new D(“class A”,”class B”,”class C”,”class D”);delete ptr;運(yùn)行結(jié)果:class Aclass Bclass Cclass D29例題:分析下列程序的輸出結(jié)果#include class A public: int n; ; class B:public
24、 A; class C:public A; class D:public B,public C int getn()return B:n; ; void main() D d; d.B:n=10; d.C:n=20; coutd.B:n,d.C:nendl; D類是從類B和類C派生的而類B和類C又都是從類A派生的,但各有自己的副本。所以對(duì)于對(duì)象d,d.B:n與d.C:n是兩個(gè)不同的數(shù)據(jù)成員它們互無聯(lián)系。 所以輸出為: 10,20 30例題:假設(shè)圖書館的圖書包含書名、編號(hào)、作者屬性,讀者包含姓名和借書證屬性,每位讀者最多可借5本書,編寫程序列出某讀者的借書情況。 分析:設(shè)計(jì)一個(gè)類,從它派生出圖書類book和讀者類reader,在reader類中有一個(gè)rentbook()成員函數(shù)用于借閱圖書。 程序代碼如下:#include #include class object char name20; int no; public: object() object(char na,int n) strcpy(name,na);no=n; void sh
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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版土地流轉(zhuǎn)承包項(xiàng)目合作開發(fā)投資合同范本3篇
- 2025年代理費(fèi)用協(xié)議范本
- 2025年銷售人員任職協(xié)議書:互聯(lián)網(wǎng)銷售團(tuán)隊(duì)建設(shè)協(xié)議2篇
- 2025年度風(fēng)力發(fā)電場(chǎng)建設(shè)與運(yùn)營合同范本4篇
- 二零二五年藝術(shù)品鑒定兼職人員保密責(zé)任書3篇
- 基于2025年度房產(chǎn)政策的商品房銷售合同
- 2025年度跨境電子商務(wù)稅收風(fēng)險(xiǎn)擔(dān)保協(xié)議4篇
- 二零二五年度直播主播與影視作品合作合同
- 2025年度供應(yīng)鏈金融貨物沖抵貨款風(fēng)險(xiǎn)控制協(xié)議
- 二零二五年度門面房房屋租賃押金合同
- 寒潮雨雪應(yīng)急預(yù)案范文(2篇)
- 垃圾車駕駛員聘用合同
- 變壓器搬遷施工方案
- 單位轉(zhuǎn)賬個(gè)人合同模板
- 八年級(jí)語文下冊(cè) 成語故事 第十五課 諱疾忌醫(yī) 第六課時(shí) 口語交際教案 新教版(漢語)
- 2024年1月高考適應(yīng)性測(cè)試“九省聯(lián)考”數(shù)學(xué) 試題(學(xué)生版+解析版)
- EPC項(xiàng)目采購階段質(zhì)量保證措施
- T-NAHIEM 101-2023 急診科建設(shè)與設(shè)備配置標(biāo)準(zhǔn)
- 四川2024年專業(yè)技術(shù)人員公需科目“數(shù)字經(jīng)濟(jì)與驅(qū)動(dòng)發(fā)展”參考答案(通用版)
- 煤炭裝卸服務(wù)合同
- 廣東省佛山市順德區(qū)2023學(xué)年中考一模物理試題(含答案解析)
評(píng)論
0/150
提交評(píng)論