計(jì)算機(jī)C++大學(xué)基礎(chǔ)教程第九章_第1頁(yè)
計(jì)算機(jī)C++大學(xué)基礎(chǔ)教程第九章_第2頁(yè)
計(jì)算機(jī)C++大學(xué)基礎(chǔ)教程第九章_第3頁(yè)
計(jì)算機(jī)C++大學(xué)基礎(chǔ)教程第九章_第4頁(yè)
計(jì)算機(jī)C++大學(xué)基礎(chǔ)教程第九章_第5頁(yè)
已閱讀5頁(yè),還剩118頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

C++大學(xué)基礎(chǔ)教程

第9章繼承與派生

北京郵電大學(xué)電信工程學(xué)院

計(jì)算機(jī)技術(shù)中心

第9章繼承與派生

9.1繼承的概念

9.2繼承方式

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

9.4多繼承

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-2-

第9章繼承與派生

?軟件重用

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-3-

第9章繼承與派生

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

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-4-

繼承的概念

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-5-

繼承的概念

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-6-

繼承的概^念

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-7-

繼承的概^念

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-8-

繼承的概^念

「Bicycle、:‘

,is-arelationships

■Mountain;;Racing,-Tandem,

Bikes::Bikes:Bikes

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-9-

第9章繼承與派生

?主要介紹:

-繼承和派生的概念

>繼承方式;

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

■多繼承中的二義性

■虛基類。

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-10-

9.1繼承的概念

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

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

類。

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

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

?不必從“草稿”開始創(chuàng)建特殊的程序?qū)ο?/p>

?繼承是處理“特殊情況”的面向?qū)ο缶幊虣C(jī)制

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-11-

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

一個(gè)直接基

類為單繼承

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

public:

〃派生類公有成員…

private:

〃派生類私有成員…

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-12-

例:定義基類shape

classshape

(

private:

intm_x,m_y;〃位置

charm.color;〃顏色

public:

voidsetposition(intx,inty);

voidsetcolor(charcolor);

intgetx();

intgety();

chargetcolor();

);

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-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北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-14-

派生新類:

?circle圓形

?rectangle矩形

告triangle三角形

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-15-

派生類的定義格式

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

public:

〃派生類公有成員…

private:

〃派生類私有成員…

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-16-

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

classderiver:publicbasel,publicbase2,privatebase3

private:

intm.derdata;

public:

voidderfunction();

);

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-17-

注意

?每一個(gè)“繼承方式”,只用于限制對(duì)緊隨其后之

基類的繼承。

?類的繼承方式是派生類對(duì)基類成員的繼承方

式。

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

類繼承來的成員的訪問權(quán)限。

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-18-

直接基類和間接基類

classbase

);?父類被稱為子

類的直接基類

classderiverl:publicbase

?父類的父類或

更圖層次的父

);類被稱為這個(gè)

classderiver2:publicderiverl子類的間接基

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-19-

派生與繼承的實(shí)例

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

小型公司人員分為:經(jīng)理、兼職技術(shù)人員、銷售經(jīng)理和

兼職推銷員.

要求:

?存儲(chǔ)所有人員的姓名、編號(hào)、級(jí)別、當(dāng)月薪水,計(jì)算月薪

總額并顯示全部信息。

?人員編號(hào)在生成人員信息時(shí)同時(shí)生成,每輸入一個(gè)人員信

息編號(hào)順序加1。

?程序能夠?qū)Σ煌藛T按不同方法提升級(jí)別,月薪的計(jì)算

方法是:

■經(jīng)理拿固定月薪;

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

■兼職推銷員的報(bào)酬按該推銷員當(dāng)月銷售額提成;

■銷售經(jīng)理既拿固定月薪也領(lǐng)取銷售提成。

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-20-

派生與繼承的實(shí)例

分析:

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

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

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心21-

classemployee

protected:

char*name;〃姓名

intindividualEmpNo;〃個(gè)人編號(hào)

intgrade;〃級(jí)另4

floataccumPay;〃月薪總額

staticintemployeeNo;〃本公司職員編號(hào)目前最大值

public:

employee();〃構(gòu)造函數(shù)

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

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

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

voiddisplayStatus();〃顯示人員信息

);

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-22-

classtechnician:publicemployee〃兼職技術(shù)人員類

(

private:新增加的成員;

floathourlyRate;//~

intworkHours;〃當(dāng)月工作時(shí)數(shù)

public:

technician();〃構(gòu)造函數(shù)

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

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

);

派生類的成員:

1.從基類繼承的成員;

2.改造基類成員;

3.添加派生類新成員.

2005-4-27北京郵電大學(xué)電信工-23-

9.2繼承方式

?三種繼承方式

public,protected、private

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

■派生類成員對(duì)基類成員的訪問控制。

■派生類對(duì)象對(duì)基類成員的訪問控制。

?定義派生類時(shí)要聲明繼承方式

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-24-

9.2.1.派生類的定義

?派生類的定義形式:

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

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

派生類成員聲明;

);

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-25-

例如:

設(shè)已有基類basel和base2,定義派生類

deriver.

classderiver:publicbasel,privatebase2

{private:

intnewmember;

public:

voidnewfun();

);

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-26-

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

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

派生類成員聲明

);

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-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北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-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北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-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北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-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北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心31-

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

類定義時(shí)聲明的成員。

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

成員,(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北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-32-

同名覆蓋

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

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

域內(nèi)或者在類外通過派生類的對(duì)象直接使用這

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

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

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

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-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北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-34-

例9.2同名覆蓋示例

#include<iostream>

usingnamespacestd;

classbase

(

public:

voidfunction(){cout?nfunctionofclassbasen?endl;}

);

classderiver:publicbase

(

public:

voidfunction(){cout?nfunctionofclass

deriver"<<endl;}

);

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-35-

voidmain()

(

deriverderobj;

derobj.function();

)

輸出結(jié)果:

functionofclassderiver

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-36-

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

數(shù)的改進(jìn)。

//number.h

classNumber

(

protected:

intm.number;

public:

intGetNumber(){returnm_number;}

voidSetNumber(intn){m_number=n;}

voidPrime();

);

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-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北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-38-

//DerNumber.h

classDerNumber:publicNumber

public:

voidPrime();

);

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-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北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-40-

〃使用模塊

#include<iostream>

#include<ctime>

#includeHnumber.hn

#includenDerNumber.hn

usingnamespacestd;

voidmain()

(

NumberaNum;

DerNumberaDerNum;

clock_tstart,finish;

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心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北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-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北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-43-

cout?HDelayforusingNumberclass:*f?elapsed_timel

?Hsecondsu?endl;

cout?HDelayforusingDerNumberclass:''

?elapsed_time2?''seconds''?endl;

輸出結(jié)果(部分):

DelayforusingNumberclass:157seconds

DelayforusingDerNumberclass:151seconds

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-44-

9.2.2.繼承的訪問控制

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

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

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-45-

9.2.2.繼承的訪問控制

黨三種繼承方式:

■公有繼承(public)

■私有繼承(private)

■保護(hù)繼承(protected)

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-46-

9.2.2.繼承的訪問控制

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

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

性控制。

?不同繼承方式?jīng)Q定的不同訪問控制權(quán)限體現(xiàn)在:

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

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

制。

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-47-

1.公有繼承

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

class派生類名:public基類名

派生類新成員定義;

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-48-

公有繼承

<publie是定義公有繼承方式的關(guān)鍵字

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

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

員和私有成員

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

問屬性。

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

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

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

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

的保護(hù)成員和私有最員。

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-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ù)據(jù)成員

floatX,Y;

);

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-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ù)據(jù)成員中的public和

protected成員,但不

floatW,H;

能訪問基類的private

);成員。

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-51-

main()

Rectanglerect;

?使用派生類的對(duì)象

cout?rect.X;//?

只能訪問基類的

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

}

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-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ù)據(jù)成員protected成員,但不

floatW,H;能訪問基類的private

成員。

);

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-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北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-54-

classRectangle:publicPoint〃派生類聲明部分

(

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

voidInitR(floatx,floaty,floatw,floath)

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

W=w;H=h;}

派生類中的成員函

floatGetH(){returnH;}

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

floatGetW(){returnW;}中的public和

protected成員,但不

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

floatW,H;成員。

);

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-55-

main()使用派生類的對(duì)象

(只能訪問基類的

成員

Rectanglerect;public

cout?rect.X;//?

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

然錯(cuò)[

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-56-

2.私有繼承

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

class派生類名:private基類名

派生類新成員定義;

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-57-

私有繼承

?private是定義私有繼承方式的關(guān)鍵字

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

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

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

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

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

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

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

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-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北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-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ù)據(jù)成員,但不能訪問基

floatW,H;類的private成員。

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-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ù)據(jù)private成員。

204嗯7WH北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-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北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-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ù)據(jù)

floatW,H;

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-63-

);

main()使用派生類的對(duì)象

不能訪問基類中的任

何成員。

Rectanglerect;

cout?rect.X;//?

cout?rect.GetX();//?

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-64-

3.保護(hù)繼承

?保護(hù)繼承的派生類定義形式:

class派生類名:protected基類名

派生類新成員定義;

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-65-

保護(hù)繼承

?protected是定義保護(hù)繼承方式的關(guān)鍵字

爭(zhēng)以保護(hù)繼承方式定義的派生類,繼承了基類中可

以繼承的成員:公有成員、保護(hù)成員和私有成

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

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

保持原來屬性。

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

護(hù)成員,不能訪問基類的私有成員。

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

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

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-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北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-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ù)據(jù)成員,但不能訪問基

floatW,H;類的private成員。

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-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ù)據(jù)private成員。

204嗯7WH北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-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北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-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ù)據(jù)

private成員。

20^(4a27W,H;北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-71-

);

main()使用派生類的對(duì)象

不能訪問基類中的任

何成員。

Rectanglerect;

cout?rect.X;一^

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

)----

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-72-

存取方式protectedprivate

繼承上加、

publicpublicprotectedprivate

protectedprotectedprotectedprivate

privateprivateprivateprivate

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-73-

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

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

的所有成員。

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

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

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-74-

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

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

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

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

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

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

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-75-

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

??單繼承時(shí)的構(gòu)造函數(shù)

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

基類名(參數(shù))

本類成員初始化賦值語(yǔ)句;

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-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ù)據(jù)成員

intX,Y;

);

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-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ù)據(jù)

intW,H;

);

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-78-

本類成員所需的形參

基類所需的形參

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

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-79-

例9.5

定義一個(gè)派生類deriver,它是基類

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

個(gè)私有的內(nèi)嵌對(duì)象成員。定義派生類

deriver的構(gòu)造函數(shù)。

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-80-

classbasel

private:

intm_base_data;

public:

basel(intdata){m_base_data=data;}

〃???

);

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心81-

classbase2

private:

intm_base_data;

public:

base2(intdata){m_base_data=data;}

〃…

);

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-82-

classAbe

private:

floatm_abc_data;

public:

Abc(floatdata){m_abc_data=data;}

);

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-83-

classderiver:publicbasel,publicbase2

private:

Abem1me/mb"erl.mmezmber!;

doublem_deriver_data;

public:

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

);

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-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北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-85-

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

deriver::deriver(floatidl,floatid2,

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

(

m_deriver_data=dd;

)

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-86-

使用對(duì)象數(shù)據(jù)成員的無參構(gòu)造函數(shù)

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

basel(bdl),base2(bd2)

(

m.deriver.data=dd;

)

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-87-

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

?如果基類和對(duì)象數(shù)據(jù)成員的構(gòu)造函數(shù)都無參

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

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

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

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

構(gòu)造函數(shù),而使用系統(tǒng)提供的默認(rèn)構(gòu)造函數(shù)。

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-88-

使用系統(tǒng)提供的默認(rèn)構(gòu)造函數(shù)

#include<iostream>

usingnamespacestd;

classbase

(

private:

intm_data;

public:

voidSetData(intdata){m_data=data;}

intGetData(){returnm_data;}

);

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-89-

classderiver:publicbase

private:

intmmember;

public:

voidSetMember(intm){m_member=m;}

intGetMember(){returnm_member;}

);

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-90-

voidmain()

intn(10);

deriverobj;

obj.SetMember(n);

cout?obj.GetMember()?endl;

)

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-91-

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

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

定義。

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

本類中新增成員。

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

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

?構(gòu)造函數(shù)的調(diào)用次序

■系統(tǒng)會(huì)使用派生類構(gòu)造函數(shù)的形參表的參數(shù)調(diào)

用基類和內(nèi)嵌對(duì)象成員的構(gòu)造函數(shù)。

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-92-

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

?系統(tǒng)在建立派生類對(duì)象時(shí),首先調(diào)用基類的構(gòu)造

函數(shù),再調(diào)用派生類的構(gòu)造函數(shù)。

?系統(tǒng)在建立組合類對(duì)象時(shí),先調(diào)用內(nèi)嵌子對(duì)象的

構(gòu)造函數(shù),在調(diào)用組合類的構(gòu)造函數(shù)。

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

類的構(gòu)造函數(shù),再調(diào)用其內(nèi)嵌子對(duì)象的構(gòu)造函

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

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-93-

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

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

按照定義派生類時(shí)這些基類被繼承的順序進(jìn)行

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

初始化列表的先后次序無關(guān)。

參如果派生類有多個(gè)對(duì)象數(shù)據(jù)成員,則系統(tǒng)調(diào)用這

些對(duì)象數(shù)據(jù)成員的構(gòu)造函數(shù)的順序是依據(jù)派生類

定義這些成員的順序進(jìn)行的,與派生類成員初始

化列表中對(duì)象數(shù)據(jù)成員構(gòu)造函數(shù)排列先后次序無

關(guān)。

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-94-

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

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

m_deriver_data=dd;

}

構(gòu)造函數(shù)的

調(diào)用次序

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-95-

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

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

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

進(jìn)行必要的清理工作。

?派生類的析構(gòu)函數(shù)只負(fù)責(zé)清理它新定義的非

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

屬至的析構(gòu)函數(shù)負(fù)責(zé)析構(gòu)。

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-96-

#include<iostream>

usingnamespacestd;

classbase

private:

intm_base_data;

public:

base(intdata){m_base_data=data;}

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

〃…

);

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-97-

classAbe

private:

floatm_abc_data;

public:

Abc(floatdata){m_abc_data=data;}

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

II...

);

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-98-

classderiver:publicbase

private:

doublem_deriver_data;

Abem1memzber1;

int*m_ptr;

public:

deriver(intbd,floatid,doubledd);

-deriver();

voidfunction();

);

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-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北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)技術(shù)中心-100-

deriver::-deriver()

if(m_ptr!=NULL)

delete[]m_ptr;

cout?HDeriverobjdeconstruction.H?endl;

)

2005-4-27北京郵電大學(xué)電信工程學(xué)院計(jì)算機(jī)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論