




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 修改利用合同范本賺錢
- 住宅合同范本
- 低價(jià)轉(zhuǎn)讓轉(zhuǎn)租合同范本
- 出售積水別墅合同范例
- 代理退保委托合同范本
- 信用貸購(gòu)車合同范例
- 關(guān)于承包保潔合同范本
- 《物資采購(gòu)合同范本》
- 養(yǎng)殖回購(gòu)合同范本
- 買裝修制式合同范本
- 巴馬格紡絲控制系統(tǒng)軟件說明書(共46頁(yè))
- 肺結(jié)核患者管理ppt課件
- 煤矸石綜合利用項(xiàng)目可行性研究報(bào)告寫作范文
- 清華大學(xué)MBA課程——運(yùn)籌學(xué)
- 《計(jì)量經(jīng)濟(jì)學(xué)》超全題庫(kù)及答案(完整版)
- 濕法冶金浸出凈化和沉積PPT課件
- 生產(chǎn)現(xiàn)場(chǎng)作業(yè)十不干PPT課件
- 雨污水管網(wǎng)勞務(wù)施工分包合同
- 通信桿路工程施工
- 初中物理光學(xué)經(jīng)典題(共23頁(yè))
- 封條VVTT檢查流程程序參考模板
評(píng)論
0/150
提交評(píng)論