




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 如果一個(gè)派生類只從一個(gè)基類派生,稱為單繼承; 如果一個(gè)派生類從多個(gè)基類派生,稱為多重繼承 關(guān)于繼承的幾點(diǎn)說(shuō)明: 如果子類繼承了父類,則子類自動(dòng)具有父類的全部數(shù)據(jù)成員(數(shù)據(jù)結(jié)構(gòu))和成員函數(shù)(功能);但是,子類對(duì)父類成員的訪問(wèn)有所限制。 子類可以定義自己的成員是數(shù)據(jù)成員和成員函數(shù)。 基類、派生類或父類、子類都是“相對(duì)”的。一個(gè)類派生出新的類就是基類。派生類也可以被其他類繼承,這個(gè)派生類同時(shí)也是基類。第1頁(yè)/共46頁(yè)派生類的定義 語(yǔ)法格式如下: class 派生類名 : 繼承方式 基類名 新增私有成員聲明語(yǔ)句列表public: 新增公有成員聲明語(yǔ)句列表protected: 新增保護(hù)成員聲明語(yǔ)句列表
2、;例如:class Book/定義基類Book private:int num;/書號(hào)float price;/定價(jià)int sellnum;/銷售量 public:float sale()/計(jì)算銷售額 return price*sellnum; ;class Book1:public Book /定義派生類Book1 private:char type;/定義圖書類別,新增加的數(shù)據(jù)成員char name40; /書名,新增加的數(shù)據(jù)成員char publisher20; /出版社,新增加的數(shù)據(jù)成員 public:void show()/顯示圖書信息,新增加的成員函數(shù) couttype:typee
3、ndl;coutname:nameendl;coutpublisher:publisherendl;第2頁(yè)/共46頁(yè)派生類的構(gòu)成 派生類中的成員包括兩部分,一部分是從基類繼承過(guò)來(lái)的成員,一部分是在聲明派生類時(shí)新增加的成員,每一部分均包括數(shù)據(jù)成員和成員函數(shù)。 派生類要繼承基類的所有成員,對(duì)基類的繼承方式不同,其訪問(wèn)屬性也不同 派生類可以在原有基類成員的基礎(chǔ)上添加新的成員,也可以更改原有成員屬性。若在派生類中聲明一個(gè)與基類成員同名的新成員,該成員就會(huì)覆蓋原有的成員;若聲明的是同名函數(shù),要保證函數(shù)的參數(shù)也完全相同第3頁(yè)/共46頁(yè)【回顧】類中的成員的不同訪問(wèn)權(quán)限 public公有成員: 一個(gè)類的公有成
4、員允許本類的成員函數(shù)、本類的對(duì)象、公有派生類的成員函數(shù)、公有派生類的對(duì)象訪問(wèn)。 private私有成員: 一個(gè)類的私有成員只允許本類的成員函數(shù)訪問(wèn)。 protected保護(hù)成員: 具有私有成員和公有成員的特性,對(duì)其派生類而言是公有成員,對(duì)其他而言是私有成員?;悢?shù)據(jù)成員聲明為保護(hù)的是有益的,派生類可以自由訪問(wèn),外部不能訪問(wèn),既實(shí)現(xiàn)了信息重用,又做到了信息隱藏。第4頁(yè)/共46頁(yè)【例7.2】類的各種成員的訪問(wèn)權(quán)限。#includeclass A int i;/私有成員protected: /保護(hù)成員int j;void fn1() cout保護(hù)成員i=i j=jendl;public: /公有成員
5、A(int x,int y) i=x;j=y;void fn2()/成員函數(shù)可以訪問(wèn)保護(hù)成員 cout公有成員i=i j=jendl;fn1();void main() A x(21,63);x.fn2();執(zhí)行結(jié)果: 公有成員i=21 j=63保護(hù)成員i=21 j=63在主程序中只能訪問(wèn)公有成員,成員函數(shù)可以訪問(wèn)保護(hù)成員和私有成員,在例7.2中,只能由函數(shù)fn2()訪問(wèn)函數(shù)fn1(),不能在主程序中調(diào)用x.fn1()。第5頁(yè)/共46頁(yè)派生類的繼承方式 繼承方式?jīng)Q定了子類對(duì)父類的訪問(wèn)權(quán)限,有3種繼承方式: private、public和protected,默認(rèn)為private1公有繼承【例79
6、-1】 當(dāng)派生類的繼承方式是公有繼承(public)時(shí),基類的public成員和protected成員的訪問(wèn)屬性在派生類中保持不變,基類的private成員被繼承到派生類中仍是基類的private成員。第6頁(yè)/共46頁(yè)2私有繼承【例79-2】當(dāng)派生類的繼承方式是私有繼承(private)時(shí),基類的public成員和protected成員被繼承到派生類中成為private成員,基類的private成員被繼承到派生類中仍為private成員第7頁(yè)/共46頁(yè)【例7.3】學(xué)校職工類的公有繼承和私有繼承。類people是基類,定義人的姓名、性別、身份號(hào)和對(duì)這3種數(shù)據(jù)的顯示。類member私有繼承peop
7、le,定義了職工號(hào)、部門和信息顯示,類member生成的對(duì)象不能直接訪問(wèn)類people中的任何成員。類worker公有繼承類member,定義了崗位和信息顯示,類worker生成的對(duì)象可以直接訪問(wèn)類member中的公有成員。類teacher私有繼承類member,定義了執(zhí)教課程和信息顯示,類teacher生成的對(duì)象不能直接訪問(wèn)類member中的任何成員。第8頁(yè)/共46頁(yè)#include#includeclass peoplechar name10,sex;/姓名,性別long idnumber;/身份號(hào)碼public:people(long num=0,char* n= ,char s=m)
8、/構(gòu)造函數(shù) idnumber=num;strcpy(name,n);sex=s; void p_show() cout人員:身份號(hào)=idnumber;cout姓名=name性別=sexendl; ;第9頁(yè)/共46頁(yè)class member:private people /教工類私有繼承people類int m_num;/工號(hào)public:char department10;/部門member(long n,char* na,char s=m,int mn=0,char* md=0):people(n,na,s) m_num=mn; strcpy(department,md); /構(gòu)造函數(shù)voi
9、d m_show()cout教工t;p_show();/訪問(wèn)基類的公有成員cout教工編號(hào):m_num=m_num單位=departmentendl;第10頁(yè)/共46頁(yè)class worker:public member/工人類公有繼承類memberchar station10;/崗位public:worker(long n,char* na,char s=m,int mn=0,char* md=0,char* st=0):member(n,na,s,mn,md) strcpy(station,st); /構(gòu)造函數(shù)void w_show()cout工人t;m_show();/訪問(wèn)基類的公有成員
10、cout崗位=stationendlendl; ;第11頁(yè)/共46頁(yè)class teacher:private member/教師類私有繼承基類memberchar course10;/執(zhí)教課程public:teacher(long n,char* na,char s=m,int mn=0,char* md=0,char* tc=0):member(n,na,s,mn,md) strcpy(course,tc); /構(gòu)造函數(shù)void t_show()cout教師t;m_show();/訪問(wèn)基類的公有成員cout課程=courseendlendl; ;第12頁(yè)/共46頁(yè)void main() w
11、orker w(123456,王祥,m,3761,生物系,實(shí)驗(yàn)室);w.w_show();w.m_show();/worker類公有繼承member,所以可以直接訪問(wèn)member類的公有成員/w.p_show(); member類私有繼承people,不可以直接訪問(wèn)people類的公有成員teacher t(661001,李輝,m,1954,計(jì)算機(jī)系,C+);t.t_show();/t.m_show(); teacher類私有繼承member,不可以直接訪問(wèn)member類的公有成員/t.p_show(); teacher類私有繼承member,member私有繼承people類,不可以直接訪問(wèn)
12、people類的公有成員執(zhí)行結(jié)果為: 工人教工人員: 編號(hào)=123456姓名=王祥性別=m教工編號(hào): m_num=3761 單位=生物系崗位=實(shí)驗(yàn)室教工人員: 編號(hào)=123456姓名=王祥性別=m教工編號(hào): m_num=3761單位=生物系教師教工人員: 編號(hào)=661001姓名=李輝性別=m教工編號(hào): m_num=1954 單位=計(jì)算機(jī)系課程=C+第13頁(yè)/共46頁(yè)3保護(hù)繼承【例79-3】 當(dāng)派生類的繼承方式是保護(hù)繼承(protected)時(shí),基類的public成員和protected成員被繼承到派生類中成為派生類的protected成員,基類的private成員被繼承到派生類中仍為priva
13、te成員。第14頁(yè)/共46頁(yè)【例7.4】類的保護(hù)繼承。#includeclass Aint i;protected:int j;void show_A1() coutA保護(hù)顯示: i=i j=jendl; public:A(int x,int y) i=x; j=y; void show_A2()coutA2在執(zhí)行show_A1().;show_A1();coutA2執(zhí)行完畢。endl; ;class B:protected Aint x;public:B(int i,int j,int k):A(i,j) x=k; void show_B()coutB在執(zhí)行show_A1().;show_A
14、1();/保護(hù)繼承可以訪問(wèn)A的保護(hù)成員coutB公有顯示:x=xendl; coutB執(zhí)行完畢。endl;第15頁(yè)/共46頁(yè)class C:public Bpublic:C(int i,int j,int x):B(i,j,x) /空語(yǔ)句void show_C()coutC在執(zhí)行show_A2().;show_A2();/說(shuō)明可以訪問(wèn)A2,A2是B的保護(hù)成員coutC在執(zhí)行show_A1().;/這兩句是多余的。show_A1();/說(shuō)明可以訪問(wèn)A1,A1也是B的保護(hù)成員coutC在執(zhí)行show_B().;show_B();coutC執(zhí)行完畢。endl;void main() B b(1,2,
15、3);b.show_B();/b.show_A2(); B從A類保護(hù)繼承,所以不能直接訪問(wèn)A類的公有成員C c(100,200,300); c.show_C();/c.show_A2(); C從B類公有繼承,而B從A保護(hù)繼承,所以不能直接訪問(wèn)A類的公有成員第16頁(yè)/共46頁(yè)執(zhí)行結(jié)果為: B在執(zhí)行show_A1().A保護(hù)顯示: i=1 j=2B公有顯示: x=3B執(zhí)行完畢。C在執(zhí)行show_A2().A2在執(zhí)行show_A1().A保護(hù)顯示: i=100 j=200A2執(zhí)行完畢。C在執(zhí)行show_A1().A保護(hù)顯示: i=100 j=200C在執(zhí)行show_B().B在執(zhí)行show_A1()
16、.A保護(hù)顯示: i=100 j=200B公有顯示: x=300B執(zhí)行完畢。C執(zhí)行完畢。ijxShow_A1()Show_A2()Show_B()在A 中私有保護(hù)無(wú)保護(hù)公有無(wú)在B中不可見(jiàn)保護(hù)私有保護(hù)保護(hù)公有在C中不可見(jiàn)保護(hù)不可見(jiàn)保護(hù)保護(hù)公有第17頁(yè)/共46頁(yè)繼承方式與成員的訪問(wèn)屬性第18頁(yè)/共46頁(yè)派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù) 在派生關(guān)系中,構(gòu)造函數(shù)和析構(gòu)函數(shù)是不能繼承的,對(duì)派生類要重新定義構(gòu)造函數(shù)和析構(gòu)函數(shù)1、派生類構(gòu)造函數(shù)的定義格式:派生類名(總參數(shù)列表): 基類名(參數(shù)列表1),子對(duì)象名1(參數(shù)列表2),子對(duì)象名2(參數(shù)列表3), 派生類中新增數(shù)據(jù)成員的初始化語(yǔ)句 注意:1)派生類構(gòu)造函數(shù)可
17、在類中聲明,類外定義,聲明時(shí)不給出基類構(gòu)造函數(shù)名及其參數(shù)列表;2)派生類構(gòu)造函數(shù)定義時(shí),其參數(shù)列表既有參數(shù)類型也有參數(shù)名稱,而其后的基類的參數(shù)列表只有參數(shù)名稱;第19頁(yè)/共46頁(yè) 執(zhí)行構(gòu)造函數(shù)的順序是:派生類構(gòu)造函數(shù)先調(diào)用基類的構(gòu)造函數(shù),對(duì)基類數(shù)據(jù)成員初始化,再執(zhí)行派生類構(gòu)造函數(shù)本身,對(duì)派生類數(shù)據(jù)成員初始化。 包含子對(duì)象的派生類構(gòu)造函數(shù)的執(zhí)行順序是:派生類構(gòu)造函數(shù)先調(diào)用基類的構(gòu)造函數(shù),對(duì)基類數(shù)據(jù)成員初始化;再調(diào)用子對(duì)象構(gòu)造函數(shù),對(duì)子對(duì)象數(shù)據(jù)成員初始化,最后執(zhí)行派生類構(gòu)造函數(shù)本身,對(duì)派生類數(shù)據(jù)成員初始化。2派生類的析構(gòu)函數(shù) 派生類析構(gòu)函數(shù)沒(méi)有函數(shù)類型、沒(méi)有參數(shù),其定義及使用方法與一般類的析構(gòu)函數(shù)
18、相同。派生類的析構(gòu)函數(shù)用來(lái)對(duì)派生類中所增加的成員進(jìn)行清理工作,同時(shí)系統(tǒng)會(huì)自動(dòng)調(diào)用基類的析構(gòu)函數(shù)和子對(duì)象的析構(gòu)函數(shù),對(duì)基類和子對(duì)象進(jìn)行清理。 析構(gòu)函數(shù)的調(diào)用順序與構(gòu)造函數(shù)正好相反:先執(zhí)行派生類的析構(gòu)函數(shù),然后調(diào)用子對(duì)象的析構(gòu)函數(shù),最后調(diào)用基類的析構(gòu)函數(shù),對(duì)基類進(jìn)行清理?!纠?9-4】【例79-5】第20頁(yè)/共46頁(yè)【例7.1】圓Circle類繼承點(diǎn)Point類。class Point float x,y;public: Point(float a=0,float b=0)x=a;y=b;void SetP(float a=0,float b=0)x=a;y=b;void Display() co
19、ut位置是: (x,y)n;class Circle: public Pointfloat r;public: Circle(float z=1,float x=0,float y=0):point(x,y)r=z;void SetC(float z=1,float x=0,float y=0)r=z;SetP(x,y);void Print()cout圓的;Display();cout圓的半徑是: rendl;第21頁(yè)/共46頁(yè)void main()Circle a(3.2);a.Print();a.SetC(6,8,2);a.Print();運(yùn)行結(jié)果為: 圓的位置是: (0,0) 圓的半徑
20、是: 3.2圓的位置是: (8,2)圓的半徑是: 6第22頁(yè)/共46頁(yè)【例7.5】聲明一個(gè)派生類對(duì)象的實(shí)際操作步驟。 設(shè)計(jì)基類。如要建立教工類,首先建立人員基類。class peoplechar name10,sex;/姓名,性別long idnumber;/身份號(hào)碼public: people(long num=0,char* n=,char s=m) /構(gòu)造函數(shù)idnumber=num;strcpy(name,n);sex=s;void p_show()cout人員: 身份號(hào)=idnumber;cout姓名=name性別=sexendl;第23頁(yè)/共46頁(yè) 設(shè)計(jì)派生類。class memb
21、er: public people/教工類公有繼承people類int m_num;/工號(hào)public: char department10;/部門member(long n,char* na,char s=m,int mn=0,char* md=0): people(n,na,s) m_num=mn;strcpy(department,md);/構(gòu)造函數(shù)void m_show()cout教工t;p_show();/訪問(wèn)基類的公有成員cout教工編號(hào): m_num=m_num單位=departmentendl; 定義對(duì)象。聲明派生類member類對(duì)象。member w(123456,王一,m,
22、789,計(jì)算機(jī)系);創(chuàng)建該類對(duì)象時(shí),自動(dòng)調(diào)用member類的構(gòu)造函數(shù),再由member類的構(gòu)造函數(shù)調(diào)用基類people類的構(gòu)造函數(shù)。首先執(zhí)行的是基類 people類的構(gòu)造函數(shù),創(chuàng)建它的成員,然后執(zhí)行派生類member類的構(gòu)造函數(shù),從而創(chuàng)建它的成員。第24頁(yè)/共46頁(yè)【例7.6】設(shè)計(jì)表示學(xué)校教師、職工和學(xué)生的類及其繼承關(guān)系。#include#includeclass peoplechar name10,sex;/姓名,性別long idnumber;/身份號(hào)碼public:people(long num=0,char* n= ,char s=m) /構(gòu)造函數(shù) idnumber=num;strcp
23、y(name,n);sex=s; void p_show() cout人員:身份號(hào)=idnumber;cout姓名=name性別=;if (sex=m|sex=M) cout男endl; if (sex=w|sex=W) cout女endl; ;第25頁(yè)/共46頁(yè)class student:public people/學(xué)生類公有繼承people類int s_num;/學(xué)號(hào)public:int s_class;/班級(jí)student(long n,char* na,char s=m,int sn=0,int sc=0):people(n,na,s) s_num=sn;s_class=sc; /構(gòu)造
24、函數(shù)void s_show()cout學(xué)生t;p_show();cout學(xué)號(hào)=s_num班級(jí)=s_classendl; ;class member:public people /教工類公有繼承people類int m_num;/工號(hào)public:char department10;/部門member(long n,char* na,char s=m,int mn=0,char* md=0):people(n,na,s) m_num=mn; strcpy(department,md); /構(gòu)造函數(shù)void m_show()cout教工t;p_show();/訪問(wèn)基類的公有成員cout教工編號(hào)=m
25、_num單位=department;第26頁(yè)/共46頁(yè)class worker:public member/工人類公有繼承類memberchar station10;/崗位public:worker(long n,char* na,char s=m,int mn=0,char* md=0,char* st=0):member(n,na,s,mn,md) strcpy(station,st); /構(gòu)造函數(shù)void w_show()cout工人t;m_show();/訪問(wèn)基類的公有成員coutt崗位=stationendl; ;class teacher:public member/教師類公有繼承
26、基類memberchar course10;/執(zhí)教課程public:teacher(long n,char* na,char s=m,int mn=0,char* md=0,char* tc=0): member(n,na,s,mn,md) strcpy(course,tc); /構(gòu)造函數(shù)void t_show()cout教師t;m_show();/訪問(wèn)基類的公有成員coutt執(zhí)教課程=courseendl; ;第27頁(yè)/共46頁(yè)void main() people p(981102,趙一,w);p.p_show();student s(781010,錢二,m,1001,982);s.s_sh
27、ow();worker w(123456,孫三,m,123,計(jì)算機(jī)系,秘書);w.w_show();teacher t(661001,李四,m,456,計(jì)算機(jī)系,C+);t.t_show();cout直接訪問(wèn)公有基類的公有成員:endl;t.m_show();/公有繼承的派生類對(duì)象直接訪問(wèn)基類的公有成員t.p_show();/公有繼承的派生類對(duì)象直接訪問(wèn)基類的基類的公有成員coutt.departmentendl;/直接訪問(wèn)基類的公有數(shù)據(jù)成員 第28頁(yè)/共46頁(yè)執(zhí)行結(jié)果為: 人員: 身份號(hào)=981102姓名=趙一性別=女學(xué)生人員: 身份號(hào)=781010姓名=錢二性別=男學(xué)號(hào)=1001班級(jí)=98
28、2工人教工人員: 身份號(hào)=123456姓名=孫三性別=男教工編號(hào)=123單位=計(jì)算機(jī)系崗位=秘書教師教工人員: 身份號(hào)=661001姓名=李四性別=男教工編號(hào)=456單位=計(jì)算機(jī)系執(zhí)教課程=C+直接訪問(wèn)公有基類的公有成員: 教工人員: 身份號(hào)=661001姓名=李四性別=男教工編號(hào)=456單位=計(jì)算機(jī)系人員: 身份號(hào)=661001姓名=李四性別=男計(jì)算機(jī)系第29頁(yè)/共46頁(yè)多重繼承 多重繼承的聲明class 派生類名 :繼承方式1 基類名1,繼承方式2 基類名2, 派生類新增加的成員;; 例如:class D:public A,private B,protected C ;第30頁(yè)/共46頁(yè)多
29、重繼承派生類的構(gòu)造函數(shù) 派生類名(總參數(shù)列表): 基類名1(參數(shù)列表),基類名2(參數(shù)列表), ,子對(duì)象名1(參數(shù)列表),子對(duì)象名2(參數(shù)列表), 派生類新增成員初始化語(yǔ)句;; 多重繼承構(gòu)造函數(shù)的執(zhí)行順序與單繼承相同,即先調(diào)用所有基類的構(gòu)造函數(shù),再調(diào)用子對(duì)象的構(gòu)造函數(shù),最后執(zhí)行派生類構(gòu)造函數(shù)。 【例79-6】第31頁(yè)/共46頁(yè)【例7.7】一個(gè)簡(jiǎn)單的多繼承。#includeclass Aint i;public: A(int ii=0)i=ii;void show() coutA show()A中i=iendl;class Bint i;public: B(int ii=0) i=ii;void
30、 show() coutB show()B中i=iendl;class C: public A,public Bint i;public: C(int iA=0,int iB=0,int iC=0): A(iA),B(iB)i=iC;void show()coutC show()C中i=iendl;void main()C c(1,2,3);c.A show();/調(diào)用對(duì)象c的基類A的成員函數(shù)show()c.B show();/調(diào)用對(duì)象c的基類B的成員函數(shù)show()c.show();/調(diào)用對(duì)象c所屬的類C的成員函數(shù)show()執(zhí)行結(jié)果為: A show()A中i=1B show()B中i=2
31、C show()C中i=3第32頁(yè)/共46頁(yè)【例7.8】西紅柿的多繼承。定義水果和蔬菜2個(gè)類作為基類,西紅柿作為派生類。class fruit/定義水果類public: print() cout直接食用,味道鮮美!endl;class vegetable/定義蔬菜類public: print() cout燒炒烹炸,餐桌佳肴!endl;class tomato: public fruit,public vegetable/定義西紅柿類public: print() cout西紅柿: 酸甜可口!endl;void main()tomato t;t.print();t.fruit print();/
32、訪問(wèn)fruit基類的成員函數(shù)t.vegetable print();/訪問(wèn)vegetable基類的成員函數(shù)運(yùn)行結(jié)果為: 西紅柿: 酸甜可口!直接食用,味道鮮美!燒炒烹炸,餐桌佳肴!第33頁(yè)/共46頁(yè)二義性問(wèn)題 當(dāng)一個(gè)派生類繼承的多個(gè)基類中有同名成員時(shí),可能出現(xiàn)對(duì)基類中某成員的訪問(wèn)不唯一的情況,這就是對(duì)基類成員訪問(wèn)的二義性問(wèn)題。 解決二義性問(wèn)題的方法:1、在引用同名成員時(shí),通過(guò)在成員名前加上類名和作用域運(yùn)算符“:”可以區(qū)別來(lái)自不同基類的成員。2、如果派生類中定義了與基類同名的成員,則派生類新增加的同名成員將覆蓋基類中的同名成員。 【例79-7】第34頁(yè)/共46頁(yè)虛基類 當(dāng)一個(gè)派生類有多個(gè)直接基類
33、,而這些直接基類又有一個(gè)共同的基類,則派生類中會(huì)保留這個(gè)共同基類成員的多份同名成員。 C+引入了虛基類方法,使得派生類在繼承間接共同基類時(shí)只保留一份同名成員。第35頁(yè)/共46頁(yè)虛基類的聲明 虛基類的聲明class 派生類名 :virtual 繼承方式 基類名例如:class A public:void display(); protected:int a;class B:virtual public A protected:int b;class C:virtual public A protected: int c;class D:public B,public C public: void
34、 display_d(); private: int d;第36頁(yè)/共46頁(yè)虛基類的構(gòu)造函數(shù) 虛基類的初始化與一般的多重繼承的初始化在語(yǔ)法上一致,但構(gòu)造函數(shù)的執(zhí)行次序不同:通常先執(zhí)行虛基類的構(gòu)造函數(shù),再執(zhí)行非虛基類的構(gòu)造函數(shù);當(dāng)包含多個(gè)虛基類時(shí),需按它們說(shuō)明的順序執(zhí)行。 【例79-8】第37頁(yè)/共46頁(yè)【例7.9】 一個(gè)虛基類繼承的例子。#includeclass Apublic: void fn()coutA: fn()endl;class B1: virtual public A/虛擬繼承public: void fn()coutB1: fn()endl;class B2: virtual
35、 public A/虛擬繼承public: void fn()coutB2: fn()endl;class C1: public B1 ;class C2: public B2 ;class D: public C1,public C2 ;void main()D obj;obj.C1 fn();obj.C2 fn();obj.A fn();/可以執(zhí)行,無(wú)二義性執(zhí)行結(jié)果為: B1: fn1()B2: fn1()A: fn()若類A不是虛基類,則語(yǔ)句obj.A fn()就不能執(zhí)行,這是因?yàn)橛?jì)算機(jī)無(wú)法確定是執(zhí)行B1繼承的基類A的函數(shù),還是執(zhí)行B2繼承的基類A的函數(shù),具有二義性第38頁(yè)/共46頁(yè)【例
36、7.10】虛基類的構(gòu)造函數(shù)。#include #include class basechar name15;public: base(char* m=王五)strcpy(name,m);void show() coutbase輸出: nameendl;class base1: virtual public basepublic: base1(char* m): base(m);class base2: virtual public basepublic: base2(char*m): base(m);第39頁(yè)/共46頁(yè)class derive: virtual public base1,pub
37、lic base2char name15;public: derive(char*,char*,char*,char*);derive(char*,char*,char*);void showD() coutderive輸出: nameendl;derive derive(char* p,char* q,char* r,char *t): base(p),base1(q),base2(r) strcpy(name,t);derive derive(char* p,char* q,char* r): base1(p),base2(q) strcpy(name,r);void main()deri
38、ve d(趙易,錢耳,孫傘,李思);d.show();d.showD();derive c(趙易,錢耳,孫傘);c.show();c.showD();base1 b(周武);b.show();輸出結(jié)果為: base輸出: 趙易derive輸出: 李思base輸出: 王五derive輸出: 孫傘base輸出: 周武第40頁(yè)/共46頁(yè)【例7.11】設(shè)計(jì)一個(gè)表示在職學(xué)生的類。先設(shè)計(jì)一個(gè)基類people,表示一般人員的基本信息,再設(shè)計(jì)一個(gè)表示工作人員的類job,還要設(shè)計(jì)一個(gè)表示學(xué)生的類student,以這些類作為基類派生出在職學(xué)生類。#include#includeclass peoplechar n
39、ame10,sex;/姓名,性別long idnumber;/身份號(hào)碼public: people(long num=0,char* n=,char s=m) /構(gòu)造函數(shù)idnumber=num;strcpy(name,n);sex=s;void p_show()cout人員: 身份號(hào)=idnumber;cout姓名=name性別=;if (sex=m|sex=M) cout男endl;if (sex=w|sex=W) cout女endl;第41頁(yè)/共46頁(yè)class job: virtual public people/工作人員類公有繼承people虛基類int m_num;/工號(hào)char department10;/單位public: job(long n,char* na,char s=m,int m
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 私人裝修住房合同范本
- 10《父母多愛(ài)我》(教學(xué)設(shè)計(jì))2023-2024學(xué)年統(tǒng)編版道德與法治三年級(jí)上冊(cè)
- 防疫用餐合同范本
- 業(yè)務(wù)代管合同范本
- 11我是一張紙 教學(xué)設(shè)計(jì)-2023-2024學(xué)年道德與法治二年級(jí)下冊(cè)統(tǒng)編版
- 銀行注銷合同范本
- Module 11 unit 2 In England,you usually drink tea with milk 英文版教學(xué)設(shè)計(jì) 2024-2025學(xué)年外研版八年級(jí)英語(yǔ)上冊(cè)
- 理財(cái)擔(dān)保合同范本
- 2025屆高考英語(yǔ)語(yǔ)法填空解題技巧教學(xué)設(shè)計(jì)
- 4 上學(xué)路上(教學(xué)設(shè)計(jì))-部編版道德與法治一年級(jí)上冊(cè)
- 一級(jí)建造師《港口與航道工程管理與實(shí)務(wù)》
- 四年級(jí)下冊(cè)勞動(dòng)《做水果拼盤》
- 工廠車間劃線標(biāo)準(zhǔn)與標(biāo)識(shí)管理(共37張PPT)
- 幼兒園課件PPT《如何有效的與家長(zhǎng)溝通》
- 一年級(jí)下冊(cè)《綜合實(shí)踐活動(dòng)》全冊(cè)教案【完整版】
- 人教版小學(xué)一年級(jí)英語(yǔ)課本上冊(cè)課件
- DSH中的常見(jiàn)語(yǔ)法考點(diǎn)
- 白酒廠安全檢查表
- 2023年民辦中學(xué)三重一大事項(xiàng)決策規(guī)定
- 公路工程崗位安全操作規(guī)程
- 起重裝卸機(jī)械操作工國(guó)家職業(yè)技能標(biāo)準(zhǔn)(2023年版)
評(píng)論
0/150
提交評(píng)論