C大學基礎教程第九章課件(PPT 123頁)_第1頁
C大學基礎教程第九章課件(PPT 123頁)_第2頁
C大學基礎教程第九章課件(PPT 123頁)_第3頁
C大學基礎教程第九章課件(PPT 123頁)_第4頁
C大學基礎教程第九章課件(PPT 123頁)_第5頁
已閱讀5頁,還剩118頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、C+大學基礎教程第9章 繼承與派生北京科技大學第1頁,共123頁。第9章 繼承與派生9.1 繼承的概念 9.2 繼承方式 9.3 派生類構造函數(shù)的定義 9.4 多繼承 2第2頁,共123頁。第9章 繼承與派生軟件重用3第3頁,共123頁。第9章 繼承與派生類具有封裝性、繼承性和多態(tài)性4第4頁,共123頁。繼承的概念自行車5第5頁,共123頁。繼承的概念6第6頁,共123頁。繼承的概念7第7頁,共123頁。繼承的概念8第8頁,共123頁。繼承的概念9第9頁,共123頁。第9章 繼承與派生主要介紹:繼承和派生的概念繼承方式;派生類的構造函數(shù)與析構函數(shù);多繼承中的二義性虛基類。 10第10頁,共12

2、3頁。9.1 繼承的概念 類的繼承是在現(xiàn)有類的基礎之上,創(chuàng)建新類的機制。稱現(xiàn)有的類為基類,新建立的類為派生類。新類繼承了基類的屬性和行為新類是基類的特殊情況。不必從“草稿”開始創(chuàng)建特殊的程序對象繼承是處理“特殊情況”的面向對象編程機制 11第11頁,共123頁。派生類的定義格式 class 派生類名:繼承方式 基類名 public: /派生類公有成員 private: /派生類私有成員 派生類只有一個直接基類為單繼承12第12頁,共123頁。例: 定義基類shapeclass shapeprivate: int m_x,m_y; /位置 char m_color; /顏色public: voi

3、d setposition(int x, int y); void setcolor(char color); int getx(); int gety(); char getcolor();13第13頁,共123頁。定義派生類(等邊三角形類)class Triangle: public Shape public:Triangle(int x, int y, char color=R, float slen = 1);float GetSideLength() const;void SetTriangle(int x, int y, char color, float slen);void D

4、raw();private:float m_SideLength;14第14頁,共123頁。派生新類:circle 圓形rectangle 矩形triangle 三角形 基類稱為父類派生類稱為子類 shapecirclerectangletriangle15第15頁,共123頁。派生類的定義格式 class 派生類名:繼承方式 基類名1, 繼承方式 基類名n public: /派生類公有成員 private: /派生類私有成員 有多個基類派生類有多個基類為多繼承16第16頁,共123頁。例:已有基類base1,base2,base3,定義派生類deriverclass deriver:publ

5、ic base1,public base2,private base3private: int m_derdata;public: void derfunction();17第17頁,共123頁。注意每一個“繼承方式”,只用于限制對緊隨其后之基類的繼承。類的繼承方式是派生類對基類成員的繼承方式。類的繼承方式指定了類外對象對于派生類從基類繼承來的成員的訪問權限。18第18頁,共123頁。直接基類和間接基類class base ;class deriver1:public base ;class deriver2:public deriver1 父類被稱為子類的直接基類 父類的父類或更高層次的父類

6、被稱為這個子類的間接基類 19第19頁,共123頁。派生與繼承的實例 公司人員管理系統(tǒng): 小型公司人員分為: 經(jīng)理、兼職技術人員、銷售經(jīng)理和兼職推銷員.要求:存儲所有人員的姓名、編號、級別、當月薪水,計算月薪總額并顯示全部信息。人員編號在生成人員信息時同時生成,每輸入一個人員信息編號順序加1。 程序能夠對不同人員按不同方法提升級別,月薪的計算方法是:經(jīng)理拿固定月薪;兼職技術人員按工作小時數(shù)領取月薪;兼職推銷員的報酬按該推銷員當月銷售額提成;銷售經(jīng)理既拿固定月薪也領取銷售提成。 20第20頁,共123頁。派生與繼承的實例 分析:描述全體職員的共性(基類)描述每一類特殊人員(派生類) 21第21頁

7、,共123頁。class employeeprotected:char *name;/姓名int individualEmpNo;/個人編號int grade;/級別float accumPay;/月薪總額static int employeeNo;/本公司職員編號目前最大值public:employee();/構造函數(shù)employee();/析構函數(shù)void pay();/計算月薪函數(shù)void promote(int);/升級函數(shù)void displayStatus();/顯示人員信息; 22第22頁,共123頁。class technician: public employee/兼職技術人

8、員類private: float hourlyRate; /每小時酬金 int workHours;/當月工作時數(shù)public:technician();/構造函數(shù) void pay();/計算月薪函數(shù)void displayStatus();/顯示人員信息;新增加的成員同名覆蓋,改造基類成員 派生類的成員: 1. 從基類繼承的成員; 2. 改造基類成員; 3. 添加派生類新成員.23第23頁,共123頁。9.2 繼承方式 三種繼承方式 public、protected、private 不同繼承方式的影響主要體現(xiàn)在: 派生類 成員 對基類成員的訪問控制。 派生類 對象 對基類成員的訪問控制。定

9、義派生類時要聲明繼承方式 24第24頁,共123頁。9.2.1. 派生類的定義 派生類的定義形式: class 派生類名:繼承方式 基類1, 繼承方式 基類2,繼承方式 基類n 派生類成員聲明; ;25第25頁,共123頁。例如: 設已有基類base1和base2,定義派生類deriver.class deriver: public base1,private base2 private: int newmember; public: void newfun();26第26頁,共123頁。單繼承情況,派生類的定義 class 派生類名:繼承方式 基類名派生類成員聲明;27第27頁,共123頁。

10、例9.1 圖形類及其派生類的聲明class Shape public:Shape(int x=0, int y=0, char c = R);int GetX() const;void SetX( int x);int GetY() const;void SetY( int x);char GetColor() const;void SetColor(char c);protected:char m_color;int m_x;int m_y;28第28頁,共123頁。class Circle : public Shape public:Circle(int x, int y, float r

11、=1, char color=R); float GetRadius () const;void SetCircle(int x, int y, float r, char color); void Draw();private:float m_Radius;29第29頁,共123頁。class Triangle: public Shape public:Triangle(int x, int y, char color=R, float slen = 1);float GetSideLength() const;void SetTriangle(int x, int y, char colo

12、r, float slen);void Draw();private:float m_SideLength;30第30頁,共123頁。class Rectangle: public Shapepublic:Rectangle(int x, int y, char color, int length=10, int width=10);int GetWidth() const;int GetHeight() const;void Draw();void SetRectangle (int x, int y, char color, int length, int width);private:i

13、nt m_Width;int m_Length;31第31頁,共123頁。 從基類 繼承的 成員派生類的成員包括:(1)繼承基類的成員,(2)派生類定義時聲明的成員。派生類自己增加的成員,完成兩個需求:(1)修改基類成員,(2)描述新的特征或方法。 m_color;m_x; m_y;GetX();SetX();GetY();SetY();GetColor();SetColor();m_Radius;GetRadius () SetCircle();Draw();m_color;m_x; m_y;GetX();SetX();GetY();SetY();GetColor();SetColor();

14、m_SideLength;GetSideLength(); SetTriangle(); Draw();m_color;m_x; m_y;GetX();SetX();GetY();SetY();GetColor();SetColor();m_Width; m_Length; GetWidth(); GetHeight(); Draw(); SetRectangle(); 派生類 增加的 成員32第32頁,共123頁。同名覆蓋 派生類修改基類的成員,是在派生類中聲明了一個與基類成員同名的新成員。在派生類作用域內或者在類外通過派生類的對象直接使用這個成員名,只能訪問到派生類中聲明的同名新成員,這個

15、新成員覆蓋了從基類繼承的同名成員,這種情況稱為同名覆蓋。 33第33頁,共123頁。class Shapepublic: void Draw();protected: ;class Triangle: public Shape public:Triangle(int x, int y, char color=R, float slen = 1);float GetSideLength() const;void SetTriangle(int x, int y, char color, float slen);void Draw();private:float m_SideLength;34第3

16、4頁,共123頁。例9.2 同名覆蓋示例 #includeusing namespace std;class base public: void function()coutfunction of class baseendl; ;class deriver: public base public: void function()coutfunction of class deriverendl; ;35第35頁,共123頁。void main() deriver derobj; derobj.function();輸出結果:function of class deriver36第36頁,共1

17、23頁。例9.3 派生類成員函數(shù)對基類同名函數(shù)的改進。 /number.hclass Numberprotected: int m_number;public: int GetNumber() return m_number; void SetNumber(int n) m_number=n; void Prime();37第37頁,共123頁。/number.cpp#include#include number.husing namespace std;void Number:Prime()int i;for(i=2; im_number; i+) /找m_number的因數(shù) if(m_nu

18、mber %i=0)break;if(m_number =i) /判斷m_number是否被小于m_number的數(shù)整除cout m_number is primeendl;elsecout m_number isnt primeendl;38第38頁,共123頁。/DerNumber.hclass DerNumber: public Numberpublic: void Prime();39第39頁,共123頁。/DerNumber.cpp#include#include#include number.h#include DerNumber.husing namespace std;void

19、 DerNumber:Prime()double sqrtm=sqrt(m_number); /用到math.hint i;for(i=2; i=sqrtm; i+)if(m_number %i=0)break;if(sqrtmi)cout m_number is prime.n;else cout m_number isnt prime.n;40第40頁,共123頁。/使用模塊#include#include#include number.h#include DerNumber.husing namespace std;void main() Number aNum; DerNumber a

20、DerNum;clock_t start, finish; 41第41頁,共123頁。 double elapsed_time1,elapsed_time2;int i;unsigned int max(100000);time( &start );for(i=10000;i=max;i+)aNum.SetNumber(i);coutaNum.GetNumber() endl;aNum.Prime();time( &finish ); 42第42頁,共123頁。 elapsed_time1 = difftime( finish, start );time( &start );for(i=100

21、00;i=max;i+)aDerNum.SetNumber(i);coutaDerNum.GetNumber() endl;aDerNum.Prime();time( &finish ); elapsed_time2 = difftime( finish, start );43第43頁,共123頁。 coutDelay for using Number class: elapsed_time1 secondsendl;coutDelay for using DerNumber class: elapsed_time2 secondsendl;輸出結果(部分):Delay for using N

22、umber class: 157 secondsDelay for using DerNumber class: 151 seconds44第44頁,共123頁。9.2.2. 繼承的訪問控制 派生類繼承了基類中除構造函數(shù)和析構函數(shù)之外的所有成員。45第45頁,共123頁。9.2.2. 繼承的訪問控制 三種繼承方式:公有繼承(public)私有繼承(private)保護繼承(protected)46第46頁,共123頁。9.2.2. 繼承的訪問控制 不同的繼承方式使得派生類從基類繼承的成員具有不同的訪問控制權限,以實現(xiàn)數(shù)據(jù)的安全性和共享性控制。不同繼承方式?jīng)Q定的不同訪問控制權限體現(xiàn)在:派生類的成

23、員函數(shù)對其繼承的基類成員的訪問控制;其它模塊通過派生類對象對其繼承的基類成員的訪問控制。47第47頁,共123頁。1. 公有繼承 公有繼承的派生類定義形式: class 派生類名:public 基類名派生類新成員定義;48第48頁,共123頁。公有繼承 public是定義公有繼承方式的關鍵字公有繼承方式定義的派生類,繼承了基類中除構造函數(shù)和析構函數(shù)外的其余成員:公有成員、保護成員和私有成員被繼承的基類成員在派生類中仍將保持其原來的訪問屬性。派生類的成員函數(shù)可以訪問基類的公有成員和保護成員,不能訪問基類的私有成員;派生類以外的其它函數(shù)可以通過派生類的對象,訪問從基類繼承的公有成員, 但不能訪問從

24、基類繼承的保護成員和私有成員。 49第49頁,共123頁。class Point/基類Point類的定義public:/公有函數(shù)成員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:/私有數(shù)據(jù)成員float X,Y;50第50頁,共123頁。class Rectangle: public Point/派生類聲明部分public:/新增公有函數(shù)成員void

25、 InitR(float x, float y, float w, float h) InitP(x,y); /訪問基類公有成員函數(shù) W=w;H=h;float GetH() return H;float GetW() return W;private:/新增私有數(shù)據(jù)成員float W,H;派生類中的 成員函數(shù) 可以直接訪問基類中的public和protected成員,但不能訪問基類的private成員。51第51頁,共123頁。main() Rectangle rect; coutrect.X; /? coutrect.GetX();/?使用派生類的 對象 只能訪問基類的public成員52

26、第52頁,共123頁。class Rectangle: public Point/派生類聲明部分public:/新增公有函數(shù)成員void InitR(float x, float y, float w, float h)X=x; Y=y; /?訪問基類私有成員 W=w;H=h;float GetH() return H;float GetW() return W;private:/新增私有數(shù)據(jù)成員float W,H;派生類中的 成員函數(shù) 可以直接訪問基類中的public和protected成員,但不能訪問基類的private成員。53第53頁,共123頁。class Point/基類Point

27、類的定義public: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;protected:float X,Y;54第54頁,共123頁。class Rectangle: public Point/派生類聲明部分public:/新增公有函數(shù)成員void InitR(float x, float y, float w, float h)X=x; Y=y; /?訪問基類的保

28、護成員 W=w;H=h;float GetH() return H;float GetW() return W;private:/新增私有數(shù)據(jù)成員float W,H;派生類中的 成員函數(shù) 可以直接訪問基類中的public和protected成員,但不能訪問基類的private成員。55第55頁,共123頁。main() Rectangle rect; coutrect.X; /? coutrect.GetX();/?使用派生類的 對象 只能訪問基類的public成員依然錯誤!56第56頁,共123頁。2.私有繼承 私有繼承的派生類定義形式: class 派生類名:private 基類名 派生類

29、新成員定義; 57第57頁,共123頁。私有繼承 private是定義私有繼承方式的關鍵字以私有繼承方式定義的派生類,繼承了基類中可以繼承的成員:公有成員、保護成員和私有成員,這些成員在派生類中的訪問屬性都是私有的。派生類的成員函數(shù)可以訪問基類的公有成員和保護成員,不能訪問基類的私有成員。派生類以外的其它函數(shù)則不能通過派生類的對象訪問從基類繼承的任何成員。 58第58頁,共123頁。class Point/基類聲明public: void InitP(float xx=0, float yy=0) X=xx;Y=yy; void Move(float xOff, float yOff) X+=

30、xOff;Y+=yOff; float GetX() return X; float GetY() return Y;private: float X,Y;59第59頁,共123頁。class Rectangle: private Point/派生類聲明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:

31、GetX();float GetY() return Point:GetY();float GetH() return H;float GetW() return W;private:/新增私有數(shù)據(jù)float W,H;派生類中的 成員函數(shù) 可以直接訪問基類中的public和protected成員,但不能訪問基類的private成員。60第60頁,共123頁。class Rectangle: private Point/派生類聲明public:/新增外部接口void InitR(float x, float y, float w, float h) X=x; Y=y;/? W=w;H=h; vo

32、id 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:/新增私有數(shù)據(jù)float W,H;派生類中的 成員函數(shù) 可以直接訪問基類中的public和protected成員,但不能訪問基類的private成員。61第61頁,共123頁。class Point/基類聲明public: void InitP(float

33、 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;protected: float X,Y;62第62頁,共123頁。class Rectangle: private Point/派生類聲明public:/新增外部接口void InitR(float x, float y, float w, float h) X=x; Y=y;/? W=w;H=h; void Move(float xOff,

34、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:/新增私有數(shù)據(jù)float W,H;63第63頁,共123頁。main() Rectangle rect; coutrect.X; /? coutrect.GetX();/?使用派生類的 對象 不能訪問基類中的任何成員。錯誤!64第64頁,共123頁。3. 保護繼承保護繼承的派生類定義形式: cl

35、ass 派生類名:protected 基類名 派生類新成員定義;65第65頁,共123頁。保護繼承protected是定義保護繼承方式的關鍵字以保護繼承方式定義的派生類,繼承了基類中可以繼承的成員:公有成員、保護成員和私有成員。其中基類的公有成員和保護成員在派生類中訪問控制屬性變成保護類型的,基類的私有成員保持原來屬性。派生類的成員函數(shù)可以訪問基類的公有成員和保護成員,不能訪問基類的私有成員。派生類以外的其它函數(shù)則不能通過派生類的對象訪問從基類繼承的任何成員。 66第66頁,共123頁。class Point/基類聲明public: void InitP(float xx=0, float y

36、y=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;67第67頁,共123頁。class Rectangle: protected Point/派生類聲明public:/新增外部接口void InitR(float x, float y, float w, float h)InitP(x,y);W=w;H=h;/派生類訪問基類公有成員void Move(float xOff, float

37、 yOff) Point:Move(xOff,yOff);float GetX() return Point:GetX();float GetY() return Point:GetY();float GetH() return H;float GetW() return W;private:/新增私有數(shù)據(jù)float W,H;派生類中的 成員函數(shù) 可以直接訪問基類中的public和protected成員,但不能訪問基類的private成員。68第68頁,共123頁。class Rectangle: protected Point/派生類聲明public:/新增外部接口void InitR(fl

38、oat x, float y, float w, float h) X=x; Y=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:/新增私有數(shù)據(jù)float W,H;派生類中的 成員函數(shù) 可以直接訪問基類中的public和protected成員,但不能訪問基類的privat

39、e成員。69第69頁,共123頁。class Point/基類聲明public: 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;protected: float X,Y;70第70頁,共123頁。class Rectangle: protected Point/派生類聲明public:/新增外部接口void InitR(float x, float y, fl

40、oat w, float h) X=x; Y=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:/新增私有數(shù)據(jù)float W,H;派生類中的 成員函數(shù) 可以直接訪問基類中的public和protected成員,但不能訪問基類的private成員。71第71頁,共123頁。m

41、ain() Rectangle rect; coutrect.X; /? coutrect.GetX();/?使用派生類的 對象 不能訪問基類中的任何成員。錯誤!72第72頁,共123頁。73第73頁,共123頁。9.3 派生類構造函數(shù)的定義 派生類繼承了基類中除構造函數(shù)和析構函數(shù)之外的所有成員?;惖臉嬙旌瘮?shù)和析構函數(shù)不能被派生類所繼承,派生類需要自己定義的構造函數(shù)和析構函數(shù)。74第74頁,共123頁。9.3.2 派生類的構造函數(shù)派生類構造函數(shù)的一般形式: 派生類名:派生類名(基類所需的形參,本類成員所需的形參):基類1(基類參數(shù)表1), ,基類n(基類參數(shù)表n),對象成員1(對象參數(shù)表1)

42、, ,對象成員m(對象參數(shù)表m) 本類基本類型數(shù)據(jù)成員初始化; 75第75頁,共123頁。派生類的構造函數(shù)單繼承時的構造函數(shù) 派生類名:派生類名(基類所需的形參,本類成員所需的形參):基類名(參數(shù)) 本類成員初始化賦值語句; 76第76頁,共123頁。class Point/基類Point類的定義public:/公有函數(shù)成員 Point(int xx=0, int yy=0) X=xx;Y=yy; void InitP(int xx=0, int yy=0) X=xx;Y=yy;void Move(int xOff, int yOff) X+=xOff;Y+=yOff;int GetX() r

43、eturn X;int GetY() return Y;private:/私有數(shù)據(jù)成員int X,Y;77第77頁,共123頁。class Rectangle: public Point public: Rectangle(int x, int y, int w, int h);void InitR(int x, int y, int w, int h)InitP(x,y);W=w;H=h;/派生類訪問基類公有成員void Move(int xOff, int yOff) Point:Move(xOff,yOff);int GetX() return Point:GetX();int GetY

44、() return Point:GetY();int GetH() return H;int GetW() return W;private:/新增私有數(shù)據(jù)int W,H;78第78頁,共123頁。Rectangle: Rectangle(int x, int y, int w, int h): Point(x,y) W=w; H=h;本類成員初始化賦值語句;基類所需的形參本類成員所需的形參基類構造函數(shù)79第79頁,共123頁。例9.5 定義一個派生類deriver,它是基類base1和base2的多繼承。Deriver類還有兩個私有的內嵌對象成員。定義派生類deriver的構造函數(shù)。80第8

45、0頁,共123頁。class base1private: int m_base_data;public: base1(int data)m_base_data=data; /;81第81頁,共123頁。class base2private: int m_base_data;public: base2(int data)m_base_data=data; /;82第82頁,共123頁。class Abcprivate: float m_abc_data;public: Abc(float data) m_abc_data=data; /;83第83頁,共123頁。class deriver:pu

46、blic base1, public base2private: Abc m_member1, m_member2; double m_deriver_data;public: deriver(int bd1, int bd2, float id1, float id2, double dd);84第84頁,共123頁。deriver: deriver(int bd1, int bd2, float id1, float id2, double dd): base1(bd1),base2(bd2), m_member1(id1), m_member2(id2) m_deriver_data=d

47、d; 85第85頁,共123頁。使用基類無參構造函數(shù) deriver: deriver(float id1, float id2, double dd): m_member1(id1), m_member2(id2) m_deriver_data=dd; 86第86頁,共123頁。使用對象數(shù)據(jù)成員的無參構造函數(shù) deriver: deriver(int bd1, int bd2, double dd):base1(bd1),base2(bd2) m_deriver_data=dd;87第87頁,共123頁。派生類的構造函數(shù)如果基類和對象數(shù)據(jù)成員的構造函數(shù)都無參數(shù),派生類構造函數(shù)形參表中將只包含

48、用于初始化它自己的基本類型數(shù)據(jù)成員的參數(shù)。如果這個派生類恰好沒有基本類型的數(shù)據(jù)成員,則其構造函數(shù)的形參表為空,可以不定義構造函數(shù),而使用系統(tǒng)提供的默認構造函數(shù)。 88第88頁,共123頁。#includeusing namespace std;class baseprivate: int m_data;public: void SetData(int data)m_data=data; int GetData()return m_data;使用系統(tǒng)提供的默認構造函數(shù)89第89頁,共123頁。class deriver:public baseprivate: int m_member;publi

49、c: void SetMember(int m) m_member=m; int GetMember()return m_member;90第90頁,共123頁。void main() int n(10); deriver obj; obj.SetMember(n); coutobj.GetMember()endl;91第91頁,共123頁。派生類的構造函數(shù)基類的構造函數(shù)不被繼承,需要在派生類中自行定義 。定義構造函數(shù)時,以合適的初值為參數(shù),初始化本類中新增成員。利用成員初始化表隱含調用基類和新增對象數(shù)據(jù)成員的構造函數(shù),初始化它們各自的數(shù)據(jù)成員。構造函數(shù)的調用次序系統(tǒng)會使用派生類構造函數(shù)的形參

50、表的參數(shù)調用基類和內嵌對象成員的構造函數(shù)。 92第92頁,共123頁。派生類的構造函數(shù)系統(tǒng)在建立派生類對象時,首先調用基類的構造函數(shù),再調用派生類的構造函數(shù)。系統(tǒng)在建立組合類對象時,先調用內嵌子對象的構造函數(shù),在調用組合類的構造函數(shù)。如果一個派生類又是組合類,則系統(tǒng)先調用其基類的構造函數(shù),再調用其內嵌子對象的構造函數(shù),再后系統(tǒng)才調用派生類的構造函數(shù)。93第93頁,共123頁。派生類的構造函數(shù)如果是多繼承,系統(tǒng)調用基類構造函數(shù)的順序是按照定義派生類時這些基類被繼承的順序進行的,與這些基類構造函數(shù)在派生類構造函數(shù)成員初始化列表的先后次序無關。如果派生類有多個對象數(shù)據(jù)成員,則系統(tǒng)調用這些對象數(shù)據(jù)成員

51、的構造函數(shù)的順序是依據(jù)派生類定義這些成員的順序進行的,與派生類成員初始化列表中對象數(shù)據(jù)成員構造函數(shù)排列先后次序無關。 94第94頁,共123頁。deriver: deriver(int bd1, int bd2, float id1, float id2, double dd):base2(bd2),base1(bd1), m_member2(id2) , m_member1(id1) m_deriver_data=dd;構造函數(shù)的調用次序95第95頁,共123頁。9.3.2 派生類的析構函數(shù) 派生類不能繼承基類的析構函數(shù),需要自己定義析構函數(shù),以便在派生類對象消亡之前進行必要的清理工作。派生

52、類的析構函數(shù)只負責清理它新定義的非對象數(shù)據(jù)成員,對象數(shù)據(jù)成員由對象成員所屬類的析構函數(shù)負責析構。 96第96頁,共123頁。#includeusing namespace std;class baseprivate: int m_base_data;public: base(int data)m_base_data=data; base()coutbase object deconstructionendl; /;97第97頁,共123頁。class Abcprivate: float m_abc_data;public: Abc(float data) m_abc_data=data; Ab

53、c()coutObject member deconstructionendl; /;98第98頁,共123頁。class deriver:public baseprivate:double m_deriver_data; Abc m_member1; int *m_ptr;public: deriver(int bd, float id, double dd); deriver(); void function();99第99頁,共123頁。deriver: deriver(int bd, float id, double dd):base(bd), m_member1(id) m_deri

54、ver_data=dd; m_ptr=new int256; if(m_ptr=NULL) coutmemory error in deriver objendl;100第100頁,共123頁。deriver:deriver() if(m_ptr!=NULL) delete m_ptr; coutDeriver obj deconstruction.endl;101第101頁,共123頁。void deriver:function() coutMaybe you want to do something with m_ptr in this function. endl; coutDo as

55、you like.endl;102第102頁,共123頁。void main() int n(1); float x(2.0f); double d(3.0); deriver obj(n,x,d); obj.function(); coutThe end of main functionendl;103第103頁,共123頁。輸出結果:Maybe you want to do something with m_ptr in this function.Do as you like.The end of main functionDeriver obj deconstruction.Objec

56、t member deconstructionbase object deconstruction104第104頁,共123頁。派生類的析構函數(shù) 如果沒有特殊指針數(shù)據(jù)成員需要清理,可以使用由系統(tǒng)提供的默認析構函數(shù)。當派生類對象消亡時,系統(tǒng)調用析構函數(shù)的順序與建立派生類對象時調用構造函數(shù)的順序正好相反,即先調用派生類的析構函數(shù),再調用其對象數(shù)據(jù)成員的析構函數(shù),最后調用基類的析構函數(shù)。 105第105頁,共123頁。9.4 多繼承9.4.1 多繼承與二義性多繼承類結構中,派生類可能有多個直接基類或間接基類,充分體現(xiàn)了軟件重用的優(yōu)點,但也可能會引起成員訪問的二義性或不確定性問題。例9.7 多繼承時的

57、二義性 106第106頁,共123頁。#includeusing namespace std;class baseprivate: int m_data; public: base(int m) m_data=m; coutbase constructionendl; base()coutbase deconstructionendl; void setdata(int data)m_data=data; int getdata(int data) return m_data;107第107頁,共123頁。class Fderiver1: public baseprivate: int m_v

58、alue;public: Fderiver1(int value,int data):base(data)m_value=value;coutFderiver1 constructionendl; Fderiver1()coutFderiver1 deconstructionendl; void setvalue(int value) m_value=value; int getvalue() return m_value; void fun();108第108頁,共123頁。class Fderiver2: public baseprivate: int m_number;public:Fd

59、eriver2(int number,int data):base(data)m_number=number;coutFderiver2 constructionendl; Fderiver2()coutFderiver2 deconstructionendl; void setnumber(int number) m_number=number; int getnumber() return m_number; void fun();109第109頁,共123頁。class Sderiver: public Fderiver1, public Fderiver2private: int m_

60、attrib;public:Sderiver(int attrib,int number,int value,int data): Fderiver1(value,data),Fderiver2(number,data)m_attrib=attrib;coutSderiver constructionendl;Sderiver()coutSderiver deconstructionendl;void setattrib(int attrib)m_attrib=attrib;int getattrib()return m_attrib;void newfun1();int newfun2();

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論