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

下載本文檔

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

文檔簡介

C++大學基礎教程

第9章繼承與派生

北京郵電大學電信工程學院

計算機技術中心

第9章繼承與派生

9.1繼承的概念

9.2繼承方式

9.3派生類構造函數(shù)的定義

9.4多繼承

2005-4-27北京郵電大學電信工程學院計算機技術中心-2-

第9章繼承與派生

?軟件重用

2005-4-27北京郵電大學電信工程學院計算機技術中心-3-

第9章繼承與派生

?類具有封裝性、繼承性和多態(tài)性

2005-4-27北京郵電大學電信工程學院計算機技術中心-4-

繼承的概念

2005-4-27北京郵電大學電信工程學院計算機技術中心-5-

繼承的概念

2005-4-27北京郵電大學電信工程學院計算機技術中心-6-

繼承的概^念

2005-4-27北京郵電大學電信工程學院計算機技術中心-7-

繼承的概^念

2005-4-27北京郵電大學電信工程學院計算機技術中心-8-

繼承的概^念

「Bicycle、:‘

,is-arelationships

■Mountain;;Racing,-Tandem,

Bikes::Bikes:Bikes

2005-4-27北京郵電大學電信工程學院計算機技術中心-9-

第9章繼承與派生

?主要介紹:

-繼承和派生的概念

>繼承方式;

-派生類的構造函數(shù)與析構函數(shù);

■多繼承中的二義性

■虛基類。

2005-4-27北京郵電大學電信工程學院計算機技術中心-10-

9.1繼承的概念

?類的繼承是在現(xiàn)有類的基礎之上,創(chuàng)建新類的

機制。稱現(xiàn)有的類為基類,新建立的類為派生

類。

-新類繼承了基類的屬性和行為

-新類是基類的特殊情況。

?不必從“草稿”開始創(chuàng)建特殊的程序對象

?繼承是處理“特殊情況”的面向對象編程機制

2005-4-27北京郵電大學電信工程學院計算機技術中心-11-

派生類的定義格式派生類只有

一個直接基

類為單繼承

class派生類名:繼承方式基類名

public:

〃派生類公有成員…

private:

〃派生類私有成員…

2005-4-27北京郵電大學電信工程學院計算機技術中心-12-

例:定義基類shape

classshape

(

private:

intm_x,m_y;〃位置

charm.color;〃顏色

public:

voidsetposition(intx,inty);

voidsetcolor(charcolor);

intgetx();

intgety();

chargetcolor();

);

2005-4-27北京郵電大學電信工程學院計算機技術中心-13-

定義派生類(等邊三角形類)

classTriangle:publicShape

(

public:

Triangle(intx,inty,charcolor=,Rz,floatslen=1);

floatGetSideLength()const;

voidSetTriangle(intx,inty,charcolor,floatslen);

voidDraw();

private:

floatm.SideLength;

);

2005-4-27北京郵電大學電信工程學院計算機技術中心-14-

派生新類:

?circle圓形

?rectangle矩形

告triangle三角形

2005-4-27北京郵電大學電信工程學院計算機技術中心-15-

派生類的定義格式

class派生類名:繼承方式基類名1,...繼承方式基類名n

public:

〃派生類公有成員…

private:

〃派生類私有成員…

2005-4-27北京郵電大學電信工程學院計算機技術中心-16-

例:已有基類basel,base2,base3,定義派生類deriver

classderiver:publicbasel,publicbase2,privatebase3

private:

intm.derdata;

public:

voidderfunction();

);

2005-4-27北京郵電大學電信工程學院計算機技術中心-17-

注意

?每一個“繼承方式”,只用于限制對緊隨其后之

基類的繼承。

?類的繼承方式是派生類對基類成員的繼承方

式。

?類的繼承方式指定了類外對象對于派生類從基

類繼承來的成員的訪問權限。

2005-4-27北京郵電大學電信工程學院計算機技術中心-18-

直接基類和間接基類

classbase

);?父類被稱為子

類的直接基類

classderiverl:publicbase

?父類的父類或

更圖層次的父

);類被稱為這個

classderiver2:publicderiverl子類的間接基

2005-4-27北京郵電大學電信工程學院計算機技術中心-19-

派生與繼承的實例

公司人員管理系統(tǒng):

小型公司人員分為:經理、兼職技術人員、銷售經理和

兼職推銷員.

要求:

?存儲所有人員的姓名、編號、級別、當月薪水,計算月薪

總額并顯示全部信息。

?人員編號在生成人員信息時同時生成,每輸入一個人員信

息編號順序加1。

?程序能夠對不同人員按不同方法提升級別,月薪的計算

方法是:

■經理拿固定月薪;

■兼職技術人員按工作小時數(shù)領取月薪;

■兼職推銷員的報酬按該推銷員當月銷售額提成;

■銷售經理既拿固定月薪也領取銷售提成。

2005-4-27北京郵電大學電信工程學院計算機技術中心-20-

派生與繼承的實例

分析:

?描述全體職員的共性(基類)

?描述每一類特殊人員(派生類)

2005-4-27北京郵電大學電信工程學院計算機技術中心21-

classemployee

protected:

char*name;〃姓名

intindividualEmpNo;〃個人編號

intgrade;〃級另4

floataccumPay;〃月薪總額

staticintemployeeNo;〃本公司職員編號目前最大值

public:

employee();〃構造函數(shù)

-employee。;〃析構函數(shù)

voidpay();〃計算月薪函數(shù)

voidpromote(int);〃升級函數(shù)

voiddisplayStatus();〃顯示人員信息

);

2005-4-27北京郵電大學電信工程學院計算機技術中心-22-

classtechnician:publicemployee〃兼職技術人員類

(

private:新增加的成員;

floathourlyRate;//~

intworkHours;〃當月工作時數(shù)

public:

technician();〃構造函數(shù)

voidpay();〃計算月薪嚴)斐二^^^[7同名覆蓋,改造基類成■

voiddisplayStatusO^====^^^A^fi^

);

派生類的成員:

1.從基類繼承的成員;

2.改造基類成員;

3.添加派生類新成員.

2005-4-27北京郵電大學電信工-23-

9.2繼承方式

?三種繼承方式

public,protected、private

?不同繼承方式的影響主要體現(xiàn)在:

■派生類成員對基類成員的訪問控制。

■派生類對象對基類成員的訪問控制。

?定義派生類時要聲明繼承方式

2005-4-27北京郵電大學電信工程學院計算機技術中心-24-

9.2.1.派生類的定義

?派生類的定義形式:

class派生類名:繼承方式基類1,

繼承方式基類2,…,繼承方式基類n

派生類成員聲明;

);

2005-4-27北京郵電大學電信工程學院計算機技術中心-25-

例如:

設已有基類basel和base2,定義派生類

deriver.

classderiver:publicbasel,privatebase2

{private:

intnewmember;

public:

voidnewfun();

);

2005-4-27北京郵電大學電信工程學院計算機技術中心-26-

單繼承情況,派生類的定義

class派生類名:繼承方式基類名

派生類成員聲明

);

2005-4-27北京郵電大學電信工程學院計算機技術中心-27-

例9.1圖形類及其派生類的聲明

classShape

public:

Shape(intx=0,inty=0,charc='R');

intGetX()const;

voidSetX(intx);

intGetY()const;

voidSetY(intx);

charGetColor()const;

voidSetColor(charc);

protected:

charm-color;

intm_x;

intm_y;

);

2005-4-27北京郵電大學電信工程學院計算機技術中心-28-

classCircle:publicShape

(

public:

Circle(intx,inty,floatr=l,charcolor=,Rz);

floatGetRadius()const;

voidSetCircle(intx,inty,floatr,charcolor);

voidDraw();

private:

floatm_Radius;

);

2005-4-27北京郵電大學電信工程學院計算機技術中心-29-

classTriangle:publicShape

(

public:

Triangle(intx,inty,charcolor=,Rz,floatslen=1);

floatGetSideLength()const;

voidSetTriangle(intx,inty,charcolor,floatslen);

voidDraw();

private:

floatm.SideLength;

);

2005-4-27北京郵電大學電信工程學院計算機技術中心-30-

classRectangle:publicShape

(

public:

Rectangle(intx,inty,charcolor,intlength=10,

intwidth=10);

intGetWidth()const;

intGetHeight()const;

voidDraw();

voidSetRectangle(intx,inty,charcolor,int

length,intwidth);

private:

intm-Width;

intm_Length;

);

2005-4-27北京郵電大學電信工程學院計算機技術中心31-

?派生類的成員包括:(1)繼承基類的成員,(2)派生

類定義時聲明的成員。

?派生類自己增加的成員,完成兩個需求:⑴修改基類

成員,(2)描述新的特征或方法。

m.color;m-color;m-color;

m_x;m_y;m-x;m_y;m_x;m_y;

從基類

GetX();SetX();GetX();SetX();GetX();SetX();川承的

GetY();SetY();GetY();SetY();GetY();SetY();成員

GetColor();GetColor();GetColor();

SetColor();SetColor();SetColor();

m_Radius;m-SideLength;m_Width;m_Length;

GetRadius()GetSideLength();GetWidthO;[派生類

SetCircle();SetTriangle();GetHeight();鋪力口的

Draw();Draw();Draw();成員

SetRectangle();

2005-4-27北京郵電大學電信工程學院計算機技術中心-32-

同名覆蓋

?派生類修改基類的成員,是在派生類中聲明了

一個與基類成員同名的新成員。在派生類作用

域內或者在類外通過派生類的對象直接使用這

個成員名,只能訪問到派生類中聲明的同名新

成員,這個新成員覆蓋了從基類繼承的同名成

員,這種情況稱為同名覆蓋。

2005-4-27北京郵電大學電信工程學院計算機技術中心-33-

classShapeclassTriangle:publicShape

((

public:

public:

Triangle(intx,inty,char

I

I=,z

IcolorR,floatslen=1);

voidDrawO{};floatGetSideLength()const;

voidSetTriangle(intx,int

protected:

y,charcolor,floatslen);

I

I

IvoidDraw();

);private:

floatm.SideLength;

);

2005-4-27北京郵電大學電信工程學院計算機技術中心-34-

例9.2同名覆蓋示例

#include<iostream>

usingnamespacestd;

classbase

(

public:

voidfunction(){cout?nfunctionofclassbasen?endl;}

);

classderiver:publicbase

(

public:

voidfunction(){cout?nfunctionofclass

deriver"<<endl;}

);

2005-4-27北京郵電大學電信工程學院計算機技術中心-35-

voidmain()

(

deriverderobj;

derobj.function();

)

輸出結果:

functionofclassderiver

2005-4-27北京郵電大學電信工程學院計算機技術中心-36-

例9.3派生類成員函數(shù)對基類同名函

數(shù)的改進。

//number.h

classNumber

(

protected:

intm.number;

public:

intGetNumber(){returnm_number;}

voidSetNumber(intn){m_number=n;}

voidPrime();

);

2005-4-27北京郵電大學電信工程學院計算機技術中心-37-

//number.cpp

#include<iostream>

#includeHnumber.hH

usingnamespacestd;

voidNumber::Prime()

{inti;

for(i=2;i<m_number;i++)〃找m_number的因數(shù)

{if(m_number%i==0)break;}

if(m_number==i)〃判斷m_mimber是否被小于m_numbei?的數(shù)整除

cout?m_number?HisprimeH?endl;

else

cout?m_numbervv"isn'tprimeH?endl;

)

2005-4-27北京郵電大學電信工程學院計算機技術中心-38-

//DerNumber.h

classDerNumber:publicNumber

public:

voidPrime();

);

2005-4-27北京郵電大學電信工程學院計算機技術中心-39-

//DerNumber.cpp

#include<iostream>

#include<cmath>

#includeHnumber.hH

#includeHDerNumber.hH

usingnamespacestd;

voidDerNumber::Prime()

{doublesqrtm=sqrt(m_number);〃用到math.h

inti;

for(i=2;i<=sqrtm;i++)

{if(m_number%i==0)break;}

if(sqrtm<i)cout?m_number?Hisprime.\nH;

elsecout?m_numbervv"isn'tprimeAn”;

)

2005-4-27北京郵電大學電信工程學院計算機技術中心-40-

〃使用模塊

#include<iostream>

#include<ctime>

#includeHnumber.hn

#includenDerNumber.hn

usingnamespacestd;

voidmain()

(

NumberaNum;

DerNumberaDerNum;

clock_tstart,finish;

2005-4-27北京郵電大學電信工程學院計算機技術中心41-

doubleelapsed_timel,elapsed_time2;

inti;

unsignedintmax(lOOOOO);

time(&start);

for(i=10000;i<=max;i++)

(

aNum.SetNumber(i);

cout?aNum.GetNumber()?HH?endl;

aNum.Prime();

)

time(&finish);

2005-4-27北京郵電大學電信工程學院計算機技術中心-42-

elapsed_timel=difftime(finish,start);

time(&start);

for(i=10000;i<=max;i++)

aDerNum.SetNumber(i);

cout?aDerNum.GetNumber()?Hn?endl;

aDerNum.Prime();

)

time(&finish);

elapsed_time2=difftime(finish,start);

2005-4-27北京郵電大學電信工程學院計算機技術中心-43-

cout?HDelayforusingNumberclass:*f?elapsed_timel

?Hsecondsu?endl;

cout?HDelayforusingDerNumberclass:''

?elapsed_time2?''seconds''?endl;

輸出結果(部分):

DelayforusingNumberclass:157seconds

DelayforusingDerNumberclass:151seconds

2005-4-27北京郵電大學電信工程學院計算機技術中心-44-

9.2.2.繼承的訪問控制

?派生類繼承了基類中除構造函數(shù)和析

構函數(shù)之外的所有成員。

2005-4-27北京郵電大學電信工程學院計算機技術中心-45-

9.2.2.繼承的訪問控制

黨三種繼承方式:

■公有繼承(public)

■私有繼承(private)

■保護繼承(protected)

2005-4-27北京郵電大學電信工程學院計算機技術中心-46-

9.2.2.繼承的訪問控制

?不同的繼承方式使得派生類從基類繼承的成員具有

不同的訪問控制權限,以實現(xiàn)數(shù)據的安全性和共享

性控制。

?不同繼承方式決定的不同訪問控制權限體現(xiàn)在:

■派生類的成員函數(shù)對其繼承的基類成員的訪問控制;

■其它模塊通過派生類對象對其繼承的基類成員的訪問控

制。

2005-4-27北京郵電大學電信工程學院計算機技術中心-47-

1.公有繼承

?公有繼承的派生類定義形式:

class派生類名:public基類名

派生類新成員定義;

2005-4-27北京郵電大學電信工程學院計算機技術中心-48-

公有繼承

<publie是定義公有繼承方式的關鍵字

?公有繼承方式定義的派生類,繼承了基類中除構造

函藪和析構函數(shù)外的其余成員:公有成員、保護成

員和私有成員

?被繼承的基類成員在派生類中仍將保持其原來的訪

問屬性。

?派生類的成員函數(shù)可以訪問基類的公有成員和保護

成員,不能訪問基類的私有成員;

??派生類以外的其它函數(shù)可以通過派生類的對象,訪

問從基類繼承的公有成員,但不能訪問從基類繼承

的保護成員和私有最員。

2005-4-27北京郵電大學電信工程學院計算機技術中心-49-

classPoint〃基類Point類的定義

public:〃公有函數(shù)成員

voidInitP(floatxx=0,floatyy=0){X=xx;Y=yy;}

voidMove(floatxOff,floatyOff){X+=xOff;Y+=yOff;}

floatGetX(){returnX;}

floatGetY(){returnY;}

private:〃私有數(shù)據成員

floatX,Y;

);

2005-4-27北京郵電大學電信工程學院計算機技術中心-50-

classRectangle:publicPoint〃派生類聲明部分

(

public:〃新增公有函數(shù)成員

voidInitR(floatx,floaty,floatw,floath)

{InitP(x,y);〃訪問基類公有成員函數(shù)

W=w;H=h;}

floatGetH(){returnH;}?派生類中的成員函

floatGetW(){returnW;}數(shù)可以直接訪問基類

private:〃新增私有數(shù)據成員中的public和

protected成員,但不

floatW,H;

能訪問基類的private

);成員。

2005-4-27北京郵電大學電信工程學院計算機技術中心-51-

main()

Rectanglerect;

?使用派生類的對象

cout?rect.X;//?

只能訪問基類的

cout?rect.GetX();//??public成員

}

2005-4-27北京郵電大學電信工程學院計算機技術中心-52-

classRectangle:publicPoint〃派生類聲明部分

(

public:〃新增公有函數(shù)成員

voidInitR(floatx,floaty,floatw,floath)

{X=x;Y=y;〃?訪問基類私有成員

W=w;H=h;}

floatGetH(){returnH;}?派生類中的成員函

floatGetW(){returnW;}數(shù)可以直接訪問基類

中的public和

private:〃新增私有數(shù)據成員protected成員,但不

floatW,H;能訪問基類的private

成員。

);

2005-4-27北京郵電大學電信工程學院計算機技術中心-53-

classPoint〃基類Point類的定義

public:

voidInitP(floatxx=0,floatyy=0){X=xx;Y=yy;}

voidMove(floatxOff,floatyOff){X+=xOff;Y+=yOff;}

floatGetX(){returnX;}

floatGetY(){returnY;}

protected:

floatX,Y;

);

2005-4-27北京郵電大學電信工程學院計算機技術中心-54-

classRectangle:publicPoint〃派生類聲明部分

(

public:〃新增公有函數(shù)成員

voidInitR(floatx,floaty,floatw,floath)

{X=x;Y=y;〃??訪問基類的保護成員

W=w;H=h;}

派生類中的成員函

floatGetH(){returnH;}

數(shù)可以直接訪問基類

floatGetW(){returnW;}中的public和

protected成員,但不

private:〃新增私有數(shù)據成員能訪問基類由private

floatW,H;成員。

);

2005-4-27北京郵電大學電信工程學院計算機技術中心-55-

main()使用派生類的對象

(只能訪問基類的

成員

Rectanglerect;public

cout?rect.X;//?

cout?rect.GetX();//??^^^^^^^

然錯[

2005-4-27北京郵電大學電信工程學院計算機技術中心-56-

2.私有繼承

?私有繼承的派生類定義形式:

class派生類名:private基類名

派生類新成員定義;

2005-4-27北京郵電大學電信工程學院計算機技術中心-57-

私有繼承

?private是定義私有繼承方式的關鍵字

?以私有繼承方式定義的派生類,繼承了基類中可以

繼承的成員:公有成員、保護成員和私有成員,這些

成員在派生類中的訪問屬性都是私有的。

,派生類的成員函數(shù)可以訪問基類的公有成員和保護

成員,不能訪問基類的私有成員。

*派生類以外的其它函數(shù)則不能通過派生類的對象訪

問從基類繼承的任何成員。

2005-4-27北京郵電大學電信工程學院計算機技術中心-58-

classPoint〃基類聲明

public:

voidInitP(floatxx=0,floatyy=0)

{X=xx;Y=yy;}

voidMove(floatxOff,floatyOff)

{X+=xOff;Y+=yOff;}

floatGetX(){returnX;}

floatGetY(){returnY;}

private:

floatX,Y;

};2005-4-27北京郵電大學電信工程學院計算機技術中心-59-

classRectangle:privatePoint〃派生類聲明

{public:〃新增外部接口

voidInitR(floatx,floaty,floatw,floath)

{InitP(x,y);W=w;H=h;}〃派生類訪問基類公有成員

voidMove(floatxOff,floatyOff){Point::Move(xOff,yOff);)

floatGetX(){returnPoint::GetX();}

floatGetY(){returnPoint::GetY();}

floatGetH(){returnH;}派生類中的成員函數(shù)

floatGetW(){returnW;}可以直接訪問基類中

的pub1ic和protected

private:〃新增私有數(shù)據成員,但不能訪問基

floatW,H;類的private成員。

2005-4-27北京郵電大學電信工程學院計算機技術中心-60-

);

classRectangle:privatePoint〃派生類聲明

{public:〃新增外部接口

voidInitR(floatx,floaty,floatw,floath)

(

X=x;Y=y;//?

W=w;H=h;

)

voidMove(floatxOff,floatyOff){Point::Move(xOff,yOff);}

floatGetX(){returnPoint::GetX();}

派生類中的成員函數(shù)

floatGetY(){returnPoint::GetY();}

可以直接訪問基類中的

floatGetH(){returnH;}public^protected^

floatGetW(){returnW;}員,但不能訪問基類的

private:〃新增私有數(shù)據private成員。

204嗯7WH北京郵電大學電信工程學院計算機技術中心-61-

);

classPoint〃基類聲明

public:

voidInitP(floatxx=0,floatyy=0)

{X=xx;Y=yy;}

voidMove(floatxOff,floatyOff)

{X+=xOff;Y+=yOff;}

floatGetX(){returnX;}

floatGetY(){returnY;}

protected:

floatX,Y;

};2005-4-27北京郵電大學電信工程學院計算機技術中心-62-

classRectangle:privatePoint〃派生類聲明

{public:〃新增外部接口

voidInitR(floatx,floaty,floatw,floath)

(

X=x;Y=y;//??

W=w;H=h;

)

voidMove(floatxOff,floatyOff){Point::Move(xOff,yOff);}

floatGetX(){returnPoint::GetX();}

floatGetY(){returnPoint::GetY();}

floatGetH(){returnH;}

floatGetW(){returnW;}

private:〃新增私有數(shù)據

floatW,H;

2005-4-27北京郵電大學電信工程學院計算機技術中心-63-

);

main()使用派生類的對象

不能訪問基類中的任

何成員。

Rectanglerect;

cout?rect.X;//?

cout?rect.GetX();//?

2005-4-27北京郵電大學電信工程學院計算機技術中心-64-

3.保護繼承

?保護繼承的派生類定義形式:

class派生類名:protected基類名

派生類新成員定義;

2005-4-27北京郵電大學電信工程學院計算機技術中心-65-

保護繼承

?protected是定義保護繼承方式的關鍵字

爭以保護繼承方式定義的派生類,繼承了基類中可

以繼承的成員:公有成員、保護成員和私有成

員。其中基類的公有成員和保護成員在派生類中

訪問控制屬性變成保護類型的,基類的私有成員

保持原來屬性。

?派生類的成員函數(shù)可以訪問基類的公有成員和保

護成員,不能訪問基類的私有成員。

?派生類以外的其它函數(shù)則不能通過派生類的對象

訪問從基類繼承的任何成員。

2005-4-27北京郵電大學電信工程學院計算機技術中心-66-

classPoint〃基類聲明

(

public:

voidInitP(floatxx=0,floatyy=0)

{X=xx;Y=yy;}

voidMove(floatxOff,floatyOff)

{X+=xOff;Y+=yOff;}

floatGetX(){returnX;}

floatGetY(){returnY;}

private:

floatX,Y;

};2005-4-27北京郵電大學電信工程學院計算機技術中心-67-

classRectangle:protectedPoint〃派生類聲明

{public:〃新增外部接口

voidInitR(floatx,floaty,floatw,floath)

{InitP(x,y);W=w;H=h;}〃派生類訪問基類公有成員

voidMove(floatxOff,floatyOff){Point::Move(xOff,yOff);}

floatGetX(){returnPoint::GetX();}

floatGetY(){returnPoint::GetY();}

floatGetH(){returnH;}派生類中的成員函數(shù)

floatGetW(){returnW;}可以直接訪問基類中

的pub1ic和protected

private:〃新增私有數(shù)據成員,但不能訪問基

floatW,H;類的private成員。

2005-4-27北京郵電大學電信工程學院計算機技術中心-68-

);

classRectangle:protectedPoint〃派生類聲明

{public:〃新增外部接口

voidInitR(floatx,floaty,floatw,floath)

X=x;Y=y;//?

W=w;H=h;

)

voidMove(floatxOff,floatyOff){Point::Move(xOff,yOff);}

floatGetX(){returnPoint::GetX();}

floatGetY(){returnPoint::GetY();}派生類中的成員函數(shù)

floatGetH(){returnH;}可以直接訪問基類中的

public^protected^

floatGetW(){returnW;}

員,但不能訪問基類的

private:〃新增私有數(shù)據private成員。

204嗯7WH北京郵電大學電信工程學院計算機技術中心-69-

);

classPoint〃基類聲明

public:

voidInitP(floatxx=0,floatyy=0)

{X=xx;Y=yy;}

voidMove(floatxOff,floatyOff)

{X+=xOff;Y+=yOff;}

floatGetX(){returnX;}

floatGetY(){returnY;}

protected:

floatX,Y;

};2005-4-27北京郵電大學電信工程學院計算機技術中心-70-

classRectangle:protectedPoint〃派生類聲明

{public:〃新增外部接口

voidInitR(floatx,floaty,floatw,floath)

(

X=x;Y=y;//??

W=w;H=h;

}

voidMove(floatxOff,floatyOff){Point::Move(xOff,yOff);}

floatGetX(){returnPoint::GetX();}

floatGetY(){returnPoint::GetY();}派生類中的成員函數(shù)

floatGetH(){returnH;}可以直接訪問基類中的

floatGetW(){returnW;}public和protected成

員,但不能訪問基類的

private:〃新增私有數(shù)據

private成員。

20^(4a27W,H;北京郵電大學電信工程學院計算機技術中心-71-

);

main()使用派生類的對象

不能訪問基類中的任

何成員。

Rectanglerect;

cout?rect.X;一^

cout?rect.GetX();?錯誤!

)----

2005-4-27北京郵電大學電信工程學院計算機技術中心-72-

存取方式protectedprivate

繼承上加、

publicpublicprotectedprivate

protectedprotectedprotectedprivate

privateprivateprivateprivate

2005-4-27北京郵電大學電信工程學院計算機技術中心-73-

9.3派生類構造函數(shù)的定義

?派生類繼承了基類中除構造函數(shù)和析構函數(shù)之外

的所有成員。

?基類的構造函數(shù)和析構函數(shù)不能被派生類所繼

承,派生類需要自己定義的構造函數(shù)和析構函數(shù)。

2005-4-27北京郵電大學電信工程學院計算機技術中心-74-

9.3.2派生類的構造函數(shù)

?派生類構造函數(shù)的一般形式:

派生類名::派生類名(基類所需的形參,本類成員所需的形參):

基類1(基類參數(shù)表1),…,基類n(基類參數(shù)表n),

對象成員1(對象參數(shù)表1),…,對象成員m(對象參數(shù)表m)

本類基本類型數(shù)據成員初始化;

2005-4-27北京郵電大學電信工程學院計算機技術中心-75-

派生類的構造函數(shù)

??單繼承時的構造函數(shù)

派生類名::派生類名(基類所需的形參,本類成員所需的形參):

基類名(參數(shù))

本類成員初始化賦值語句;

2005-4-27北京郵電大學電信工程學院計算機技術中心-76-

classPoint〃基類Point類的定義

public:〃公有函數(shù)成員

Point(intxx=0,intyy=0){X=xx;Y=yy;}

voidInitP(intxx=0,intyy=0){X=xx;Y=yy;}

voidMove(intxOff,intyOff){X+=xOff;Y+=yOff;}

intGetX(){returnX;}

intGetY(){returnY;}

private:〃私有數(shù)據成員

intX,Y;

);

2005-4-27北京郵電大學電信工程學院計算機技術中心-77-

classRectangle:publicPoint

(

public:

Rectangle(intx,inty,intw,inth);

voidInitR(intx,inty,intw,inth)

{InitP(x,y);W=w;H=h;}〃派生類訪問基類公有成員

voidMove(intxOff,intyOff){Point::Move(xOff,yOff);}

intGetX(){returnPoint::GetX();}

intGetY(){returnPoint::GetY();}

intGetH(){returnH;}

intGetW(){returnW;}

private:〃新增私有數(shù)據

intW,H;

);

2005-4-27北京郵電大學電信工程學院計算機技術中心-78-

本類成員所需的形參

基類所需的形參

Rectangle::Rectangle(intx,inty,intw,inth):Poing,y)

2005-4-27北京郵電大學電信工程學院計算機技術中心-79-

例9.5

定義一個派生類deriver,它是基類

basel和base2的多繼承。Deriver類還有兩

個私有的內嵌對象成員。定義派生類

deriver的構造函數(shù)。

2005-4-27北京郵電大學電信工程學院計算機技術中心-80-

classbasel

private:

intm_base_data;

public:

basel(intdata){m_base_data=data;}

〃???

);

2005-4-27北京郵電大學電信工程學院計算機技術中心81-

classbase2

private:

intm_base_data;

public:

base2(intdata){m_base_data=data;}

〃…

);

2005-4-27北京郵電大學電信工程學院計算機技術中心-82-

classAbe

private:

floatm_abc_data;

public:

Abc(floatdata){m_abc_data=data;}

);

2005-4-27北京郵電大學電信工程學院計算機技術中心-83-

classderiver:publicbasel,publicbase2

private:

Abem1me/mb"erl.mmezmber!;

doublem_deriver_data;

public:

deriver(intbdl,intbd2,floatidl,floatid2,doubledd);

);

2005-4-27北京郵電大學電信工程學院計算機技術中心-84-

deriver::deriver(intbdl,intbd2,floatidl,floatid2,

doubledd):basel(bdl),base2(bd2),

m_memberl(idl),m_member2(id2)

(

m_deriver_data=dd;

2005-4-27北京郵電大學電信工程學院計算機技術中心-85-

使用基類無參構造函數(shù)

deriver::deriver(floatidl,floatid2,

doubledd):m_memberl(idl),m_member2(id2)

(

m_deriver_data=dd;

)

2005-4-27北京郵電大學電信工程學院計算機技術中心-86-

使用對象數(shù)據成員的無參構造函數(shù)

deriver::deriver(intbdl,intbd2,doubledd):

basel(bdl),base2(bd2)

(

m.deriver.data=dd;

)

2005-4-27北京郵電大學電信工程學院計算機技術中心-87-

派生類的構造函數(shù)

?如果基類和對象數(shù)據成員的構造函數(shù)都無參

數(shù),派生類構造函數(shù)形參表中將只包含用于初

始化它自己的基本類型數(shù)據成員的參數(shù)。

?如果這個派生類恰好沒有基本類型的數(shù)據成

員,則其構造函數(shù)的形參表為空,可以不定義

構造函數(shù),而使用系統(tǒng)提供的默認構造函數(shù)。

2005-4-27北京郵電大學電信工程學院計算機技術中心-88-

使用系統(tǒng)提供的默認構造函數(shù)

#include<iostream>

usingnamespacestd;

classbase

(

private:

intm_data;

public:

voidSetData(intdata){m_data=data;}

intGetData(){returnm_data;}

);

2005-4-27北京郵電大學電信工程學院計算機技術中心-89-

classderiver:publicbase

private:

intmmember;

public:

voidSetMember(intm){m_member=m;}

intGetMember(){returnm_member;}

);

2005-4-27北京郵電大學電信工程學院計算機技術中心-90-

voidmain()

intn(10);

deriverobj;

obj.SetMember(n);

cout?obj.GetMember()?endl;

)

2005-4-27北京郵電大學電信工程學院計算機技術中心-91-

派生類的構造函數(shù)

?基類的構造函數(shù)不被繼承,需要在派生類中自行

定義。

?定義構造函數(shù)時,以合適的初值為參數(shù),初始化

本類中新增成員。

?利用成員初始化表隱含調用基類和新增對象數(shù)據

成員的構造函數(shù),初始化它們各自的數(shù)據成員。

?構造函數(shù)的調用次序

■系統(tǒng)會使用派生類構造函數(shù)的形參表的參數(shù)調

用基類和內嵌對象成員的構造函數(shù)。

2005-4-27北京郵電大學電信工程學院計算機技術中心-92-

派生類的構造函數(shù)

?系統(tǒng)在建立派生類對象時,首先調用基類的構造

函數(shù),再調用派生類的構造函數(shù)。

?系統(tǒng)在建立組合類對象時,先調用內嵌子對象的

構造函數(shù),在調用組合類的構造函數(shù)。

?如果一個派生類又是組合類,則系統(tǒng)先調用其基

類的構造函數(shù),再調用其內嵌子對象的構造函

數(shù),再后系統(tǒng)才調用派生類的構造函數(shù)。

2005-4-27北京郵電大學電信工程學院計算機技術中心-93-

派生類的構造函數(shù)

?如果是多繼承,系統(tǒng)調用基類構造函數(shù)的順序是

按照定義派生類時這些基類被繼承的順序進行

的,與這些基類構造函數(shù)在派生類構造函數(shù)成員

初始化列表的先后次序無關。

參如果派生類有多個對象數(shù)據成員,則系統(tǒng)調用這

些對象數(shù)據成員的構造函數(shù)的順序是依據派生類

定義這些成員的順序進行的,與派生類成員初始

化列表中對象數(shù)據成員構造函數(shù)排列先后次序無

關。

2005-4-27北京郵電大學電信工程學院計算機技術中心-94-

deriver::deriver(intbdl,intbd2,floatidl,floatid2,doubledd):

base2(bd2),basel(bdl),m_member2(id2),m_memberl(idl)

m_deriver_data=dd;

}

構造函數(shù)的

調用次序

2005-4-27北京郵電大學電信工程學院計算機技術中心-95-

9.3.2派生類的析構函數(shù)

?派生類不能繼承基類的析構函數(shù),需要自己

定義析構函數(shù),以便在派生類對象消亡之前

進行必要的清理工作。

?派生類的析構函數(shù)只負責清理它新定義的非

對象數(shù)據成員,對象數(shù)據最員由對象成員所

屬至的析構函數(shù)負責析構。

2005-4-27北京郵電大學電信工程學院計算機技術中心-96-

#include<iostream>

usingnamespacestd;

classbase

private:

intm_base_data;

public:

base(intdata){m_base_data=data;}

-base(){cout?11baseobjectdeconstruction*1?endl;}

〃…

);

2005-4-27北京郵電大學電信工程學院計算機技術中心-97-

classAbe

private:

floatm_abc_data;

public:

Abc(floatdata){m_abc_data=data;}

-Abc(){cout?nObjectmemberdeconstruction*1?endl;}

II...

);

2005-4-27北京郵電大學電信工程學院計算機技術中心-98-

classderiver:publicbase

private:

doublem_deriver_data;

Abem1memzber1;

int*m_ptr;

public:

deriver(intbd,floatid,doubledd);

-deriver();

voidfunction();

);

2005-4-27北京郵電大學電信工程學院計算機技術中心-99-

deriver::deriver(intbd,floatid,doubledd):base(bd),

m_memberl(id)

(

m_deriver_data=dd;

m_ptr=newint[256];

if(m_ptr==NULL)

cout?Hmemoryerrorinderiverobjn?endl;

)

2005-4-27北京郵電大學電信工程學院計算機技術中心-100-

deriver::-deriver()

if(m_ptr!=NULL)

delete[]m_ptr;

cout?HDeriverobjdeconstruction.H?endl;

)

2005-4-27北京郵電大學電信工程學院計算機

溫馨提示

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

評論

0/150

提交評論