下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、面向?qū)ο蟪绦蛟O(shè)計(jì)派生新類 內(nèi)容提要類層次的問(wèn)題派生與繼承派生類多繼承與虛擬繼承3提出問(wèn)題【例】編寫(xiě)一個(gè)程序?qū)崿F(xiàn)小型公司的工資管理。該公司主要有4類人員:經(jīng)理、兼職技術(shù)員、銷售員和銷售經(jīng)理。要求存儲(chǔ)這些人員的編號(hào)、姓名和月工資,計(jì)算月工資并顯示全部信息。4月工資計(jì)算辦法是:1.經(jīng)理拿固定月工資8000元;2.兼職技術(shù)員按每小時(shí)100元領(lǐng)取月工資;3.銷售員按該當(dāng)月銷售額的6%提成;4.銷售經(jīng)理既拿固定月工資也領(lǐng)取銷售提成,固定月工資為5000元,銷售提成為所管轄部門(mén)當(dāng)月銷售總額的5。5分析問(wèn)題由于對(duì)這4類人員的月工資計(jì)算方法不同,顯示信息的內(nèi)容也不同,因此不能用同一個(gè)類來(lái)描述,我們?cè)O(shè)計(jì)4個(gè)類分別
2、描述這4類人員。但是,這4個(gè)類中又有很多相同的,如姓名、編號(hào)、工資,都要計(jì)算月工資和顯示信息等,只是各自的實(shí)現(xiàn)方法有所不同。6按照常規(guī)思維方式,我們應(yīng)該先統(tǒng)一描述該公司全體員工的共性以及對(duì)全體人員的處理功能;描述某一類人員時(shí),首先說(shuō)明他是該公司的員工,然后再逐一描述該類人員的個(gè)性。這種描述方法反映到面向?qū)ο蟮某绦蛟O(shè)計(jì)中就是類的繼承與派生。對(duì)各類人員的統(tǒng)一描述就構(gòu)成了一個(gè)基類,而對(duì)每一類人員的特殊描述就可以通過(guò)從基類創(chuàng)建派生類來(lái)實(shí)現(xiàn)。 7這個(gè)問(wèn)題涉及多個(gè)相關(guān)的類,他們具有一些共同特征,因此,我們可以定義一個(gè)統(tǒng)一他們屬性和操作的類,如Employee類,再?gòu)脑擃愡M(jìn)行派生,類似于人類社會(huì)的繁衍。這就
3、是本章要介紹的派生與繼承。 8派生與繼承派生是指由基類創(chuàng)建新類的過(guò)程。新類稱為派生類或子類,基類也可稱作父類。繼承是指新類(派生類)保留基類的成員的特性。繼承意味著“自動(dòng)地?fù)碛小?,即派生類中不必重新定義已在基類中定義過(guò)的屬性和操作,而是自動(dòng)地、隱含地?fù)碛衅浠惖膶傩院托袨?。繼承具有傳遞性。繼承的作用是體現(xiàn)特殊與一般的關(guān)系,同時(shí),實(shí)現(xiàn)了代碼重用。9class A int i;/基類成員;class B:public A/A派生了B,B繼承了A,B自/動(dòng)擁有A的成員 int j;/定義派生類的新成員;10SalesManagerEmployeeSalesmanManagerTechnician11
4、派生類定義派生類是由基類通過(guò)派生而創(chuàng)建出來(lái)的新類,是基類的特殊類。派生類自動(dòng)繼承了基類的全部數(shù)據(jù)成員和除了構(gòu)造、析構(gòu)函數(shù)之外的全部成員函數(shù),同時(shí)具有自己新定義的成員,并不等同于基類。12派生類的定義格式如下:class : ;類的繼承方式有公有繼承、保護(hù)繼承和私有繼承三種,分別用public、protected和private來(lái)表示,默認(rèn)情況下為私有繼承。13class Base private:int b_number;public:Base( )Base(int i) : b_number (i) int get_number( ) return b_number;void print(
5、) cout b_number endl; ;class Derived : public Base private:int d_number;public:Derived( int i, int j ) : Base(i), d_number(j) ; void print( ) cout get_number( ) ; cout d_number endl;14派生類成員的構(gòu)成派生類的生成經(jīng)歷了3個(gè)步驟:吸收基類成員、改造基類成員、添加派生類新成員。吸收基類成員就是繼承基類的成員,但不繼承基類的構(gòu)造函數(shù)和析構(gòu)函數(shù)。改造基類成員包括兩方面,一是通過(guò)派生類定義時(shí)的繼承方式來(lái)控制改變基類成員在派
6、生類中的訪問(wèn)控制屬性;二是定義同名成員屏蔽基類成員(但是該基類成員仍然存在)。添加新成員就是派生類中定義新的成員,擴(kuò)展新功能;另外,還要定義自己的構(gòu)造和析構(gòu)函數(shù)。15派生后訪問(wèn)權(quán)限控制三種不同繼承方式導(dǎo)致原來(lái)具有不同訪問(wèn)屬性的的基類成員在派生類中的訪問(wèn)屬性也有所不同,具體如下表所示。 繼承方式 基類成員公有繼承保護(hù)繼承私有繼承公有成員公有保護(hù)私有保護(hù)成員保護(hù)保護(hù)私有私有成員派生類新成員不可訪問(wèn)派生類新成員不可訪問(wèn)派生類新成員不可訪問(wèn)16公有繼承當(dāng)類的繼承方式為公有繼承時(shí),在派生類中,基類的公有成員和保護(hù)成員被繼承后分別成為派生類的公有成員和保護(hù)成員,派生類的新成員可以直接訪問(wèn)他們,而派生類的新
7、成員不能直接訪問(wèn)基類的私有成員。在類外,派生類的對(duì)象可以訪問(wèn)繼承下來(lái)的基類公有成員。17示例:從Point類派生出新的Rectangle類。矩形是由一個(gè)點(diǎn)加上長(zhǎng)、寬構(gòu)成,矩形的點(diǎn)具備了Point類的全部特征,同時(shí),矩形自身也有一些特點(diǎn),這就需要在繼承Point類的同時(shí)添加新的成員。這兩個(gè)類的繼承關(guān)系可以用UML圖描述,如下圖所示。18+ InitP(xx:float=0,yy:float=0):void+ Move(xOff:float,yOff:float):void+ GetX():float+ GetY():float- X:float- Y:floatPoint+InitR(x:flo
8、at,y:float,w:float,h:float):void+GetH():float+GetW():float- W:float- H:floatRectangle派生類Rectangle基類Point19/rectangle.hclass Point/base classpublic:void InitP(float xx=0, float yy=0) X=xx;Y=yy;void Move(float xOff,float yOff) X+=xOff; Y+=yOff; float GetX()return X;float GetY()return Y;private:float X
9、,Y;class Rectangle: public Point/derived classpublic:void InitR(float x, float y,float w,float h) InitP(x,y); W=w;H=h; float GetH() return H;float GetW() return W;private:float W,H;20/test.cpp#include rectangle.h#include using namespace std;int main()Rectangle rect;rect.InitR(2,3,20,10);rect.Move(3,
10、2);coutThe data of rect(X,Y,W,H):endl;coutrect.GetX(),rect.GetY(), rect.GetW(),rect.GetH()endl;return 0; The run result is:The data of rect(X,Y,W,H):5,5,20,1021保護(hù)繼承當(dāng)類的繼承方式為保護(hù)繼承時(shí),在派生類中,基類的公有成員和保護(hù)成員被繼承后全部成為派生類的保護(hù)成員,派生類的新成員可以直接訪問(wèn)他們,而派生類的新成員不能直接訪問(wèn)基類的私有成員。在類外,派生類的對(duì)象不能訪問(wèn)繼承下來(lái)的所有基類成員。保護(hù)成員具有兩面性,對(duì)外界而言是不可見(jiàn)的,但對(duì)
11、于它的派生類則是可見(jiàn)的。在面向?qū)ο蟪绦蛟O(shè)計(jì)中,若要對(duì)基類的某些函數(shù)功能進(jìn)行擴(kuò)充和改造,就可以采用保護(hù)繼承的方式,并在派生類中定義同名成員函數(shù)來(lái)實(shí)現(xiàn)。22/rectangle.hclass Point/base classpublic:void InitP(float xx=0, float yy=0) X=xx;Y=yy;void Move(float xOff,float yOff) X+=xOff; Y+=yOff; float GetX()return X;float GetY()return Y;private:float X,Y;class Rectangle: protected
12、Point/derived classpublic:void InitR(float x, float y,float w,float h) InitP(x,y); W=w;H=h; void Move(float xOff, float yOff) Point:Move(xOff,yOff); float GetX() return Point:GetX();float GetY() return Point:GetY();float GetH() return H;float GetW() return W;private:float W,H;23/test.cpp#include rec
13、tangle.h#include using namespace std;int main()Rectangle rect;rect.InitR(2,3,20,10);rect.Move(3,2);coutThe data of rect(X,Y,W,H):endl;coutrect.GetX(),rect.GetY(), rect.GetW(),rect.GetH()endl;return 0; The run result is:The data of rect(X,Y,W,H):5,5,20,1024上面例子中,主函數(shù)和公有繼承例子中的主函數(shù)完全相同,但是執(zhí)行過(guò)程有所不同。本例子中的Re
14、ctangle類對(duì)象rect調(diào)用的函數(shù)都是派生類自身的公有成員,因?yàn)槭潜Wo(hù)繼承,所以不能訪問(wèn)基類的成員。本例只是修改了派生類的內(nèi)容,基類和主函數(shù)部分根本沒(méi)有做過(guò)任何改動(dòng)。由此可以看出面向?qū)ο蟪绦蛟O(shè)計(jì)中封裝性的優(yōu)越性,Rectangle類的外部接口不變,內(nèi)部成員的實(shí)現(xiàn)做了改造,根本就沒(méi)有影響到程序的其他部分,這正是面向?qū)ο蟪绦蛟O(shè)計(jì)重用與可擴(kuò)充性的一個(gè)實(shí)際體現(xiàn)。25私有繼承當(dāng)類的繼承方式為私有繼承時(shí),在派生類中,基類的公有成員和保護(hù)成員被繼承后全部成為派生類的私有成員,派生類的新成員可以直接訪問(wèn)他們,而派生類的新成員不能直接訪問(wèn)基類的私有成員。在類外,派生類的對(duì)象不能訪問(wèn)繼承下來(lái)的所有基類成員。私
15、有繼承方式下,基類成員不能被進(jìn)一步傳遞給派生類的派生類,而保護(hù)繼承方式則允許基類成員被進(jìn)一步傳遞給派生類的派生類。26/rectangle.hclass Point/base classpublic:void InitP(float xx=0, float yy=0) X=xx;Y=yy;void Move(float xOff,float yOff) X+=xOff; Y+=yOff; float GetX()return X;float GetY()return Y;private:float X,Y;class Rectangle: private Point/derived class
16、public:void InitR(float x, float y,float w,float h) InitP(x,y); W=w;H=h; void Move(float xOff, float yOff) Point:Move(xOff,yOff);float GetX() return Point:GetX();float GetY() return Point:GetY();float GetH() return H;float GetW() return W;private:float W,H;27/test.cpp#include rectangle.h#include using namespace std;int main()Rectangle rect;rect.InitR(2,3,20,10);rect.Move(3,2);coutThe data of rect(X,Y,W,H):endl;coutrect.GetX(),rect.GetY
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年食堂炊事員應(yīng)急管理與服務(wù)合同范本3篇
- 2025年蟹塘養(yǎng)殖基地承包與品牌授權(quán)協(xié)議3篇
- 二零二五版美容院美容設(shè)備研發(fā)與技術(shù)支持采購(gòu)合同4篇
- 2025年高速公路停車場(chǎng)租賃及旅游導(dǎo)覽服務(wù)合同3篇
- 2025年星巴克綠色環(huán)保包裝材料采購(gòu)合同2篇
- 二零二五年度面包磚生產(chǎn)設(shè)備租賃合同4篇
- 2025年度采礦權(quán)出讓合同范本:礦業(yè)權(quán)收益分配機(jī)制3篇
- 2025年度特色菜品研發(fā)廚師合作合同4篇
- 2025版吸糞車租賃合同范本(含保險(xiǎn)條款)3篇
- 2025版售樓部裝修工程防水防潮合同3篇
- 湖北省黃石市陽(yáng)新縣2024-2025學(xué)年八年級(jí)上學(xué)期數(shù)學(xué)期末考試題 含答案
- 硝化棉是天然纖維素硝化棉制造行業(yè)分析報(bào)告
- 央視網(wǎng)2025亞冬會(huì)營(yíng)銷方案
- 《無(wú)砟軌道施工與組織》 課件 第十講雙塊式無(wú)砟軌道施工工藝
- 江蘇省南京市、鹽城市2023-2024學(xué)年高三上學(xué)期期末調(diào)研測(cè)試+英語(yǔ)+ 含答案
- 2024新版《藥品管理法》培訓(xùn)課件
- 《阻燃材料與技術(shù)》課件 第7講 阻燃橡膠材料
- 爆炸物運(yùn)輸安全保障方案
- 江蘇省南京市2025屆高三學(xué)業(yè)水平調(diào)研考試數(shù)學(xué)試卷(解析版)
- 鉗工考試題及參考答案
- 移動(dòng)商務(wù)內(nèi)容運(yùn)營(yíng)(吳洪貴)任務(wù)五 引發(fā)用戶共鳴外部條件的把控
評(píng)論
0/150
提交評(píng)論