




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第八章面象程序設(shè)計象程序設(shè)計概述面結(jié)構(gòu)類和對象繼承和派生多態(tài)性程序舉例8.1面象程序設(shè)計(OOP)概述Object
Oriented
Programming基本概念對象:現(xiàn)實世界的實體,每個對象都有所屬的類類:
對一組對象共同具有的屬性和行為的抽象,具有封裝和隱藏性、還具有繼承性。消息:向某對象請求服務(wù)的一種表達方式,是對象與外界、對象與其它對象之間聯(lián)系的工具方法:對某對象接受消息后所采取的操作的描述。特點封裝性C++中,通過類和對象實現(xiàn)對數(shù)據(jù)的封裝,使得程序的修改維護更方便。是OOP的基礎(chǔ)。繼承性連接類與類的層次模型,利用現(xiàn)有類派生出新類的過程稱為類繼承,支持代碼重用、提供了無限重復(fù)利用程序資源的途徑、節(jié)省程序開發(fā)的時間和資源,是OOP的關(guān)鍵。多態(tài)性發(fā)出同樣的消息被不同類型的對象接收時導(dǎo)致完全不同的行為,是OOP的重要補充說明結(jié)構(gòu)類型的關(guān)鍵字8.2結(jié)構(gòu)C++中的類從C語言中的結(jié)構(gòu)概念演變而來結(jié)構(gòu)類型說明形式struct
結(jié)構(gòu)類型標(biāo)識符{結(jié)構(gòu)成員1;結(jié)構(gòu)成員2;┆結(jié)構(gòu)成員n;};類型可任意(不能為該結(jié)構(gòu)自身)struct
date{int
month;int
day;int
year;};struct
man{char
name[15];char
sex;int
age;date
birthday;};如,說明一個結(jié)構(gòu)類型date,含三個整型數(shù)據(jù)成員在此基礎(chǔ)上,又可說明另一個結(jié)構(gòu)類型manNamesexagebirthdaymonthdayyearstruct
man結(jié)構(gòu)類型結(jié)構(gòu)變量定義struct
man man1,
man2;先說明結(jié)構(gòu)類型再定義結(jié)構(gòu)變量在說明結(jié)構(gòu)數(shù)據(jù)類型的同時定義結(jié)構(gòu)變量省略結(jié)構(gòu)標(biāo)識符直接定義結(jié)構(gòu)類型變量struct
man{
char
name[15];char
sex;int
age;struct
date
birthday;}
man1,
man2;struct{
char
name[15];char
sex;int
age;struct
date
birthday;}
man1,
man2;無類型名變量結(jié)構(gòu)變量的形式:結(jié)構(gòu)變量名.成員名或
(*指向結(jié)構(gòu)的指針).成員名指向結(jié)構(gòu)的指針->成員名或通過指向結(jié)構(gòu)的指針結(jié)構(gòu)變量成員成員
運算符優(yōu)先級最高的四個運算符之一括號不能少strcpy
(,
"Fang
Min");p->birthday.month
=
8;如,假設(shè)有定義manm,*p=&m;則可如下
結(jié)構(gòu)成員8.3類和對象#include"iostream.h"classCircle{private:double
x,y,r;public:voidprint(){cout<<"圓心:("<<x<<","<<y<<")"<<endl;cout<<"半徑:"<<r<<endl;}void
set(double
x1,double
y1,double
r1){
x=x1;
y=y1;
r=r1;}};void
main(){Circle
p;}引例類定義數(shù)據(jù)成員成員函數(shù)定義類對象p.set(0,0,2);p.print();對對象調(diào)用成員函數(shù)Circle類將圓的屬性(圓心坐標(biāo)和半徑)和操作(print、set)封裝在一起上述定義的Circle類實際上也相當(dāng)于一種新的數(shù)據(jù)類型,包含了數(shù)據(jù)和對數(shù)據(jù)的操作,其成員描述如下:數(shù)據(jù)成員成員函數(shù)名稱含義名稱功能x圓心坐標(biāo)x值set設(shè)置數(shù)據(jù)成員值y圓心坐標(biāo)y值print輸出數(shù)據(jù)成員值r圓半徑8.3.1類的定義class
類名{public:<成員函數(shù)或數(shù)據(jù)成員的說明>;private:<成員函數(shù)或數(shù)據(jù)成員的說明>;protected:<成員函數(shù)或數(shù)據(jù)成員的說明>;};<各成員函數(shù)的實現(xiàn)>類是一種復(fù)雜的數(shù)據(jù)類型,它是將不同類型的數(shù)據(jù)和與這些數(shù)據(jù)相關(guān)的運算封裝在一起的集合體,類的結(jié)構(gòu)是用來確定一類對象的行為,而這些行為是通過類的數(shù)據(jù)結(jié)構(gòu)和相關(guān)的操作來確定的。定義格式:
定義類的關(guān)鍵字說明部分實現(xiàn)部分訪問權(quán)限修飾符說明:定義包括說明部分
部分。若成員函數(shù)在說明部分已定義,則實現(xiàn)部分可省略。權(quán)限修飾符:public(公有)、private(私有
)和protected(保護)缺省時為private。公有成員通常為成員函數(shù),可在程序中
,私有成員函數(shù)才可
。通常是數(shù)據(jù)成員,只有成員函數(shù)或類體中不允許對數(shù)據(jù)成員初始化。自身類的對象不可以作為自己的成員classB{private:int
year=2002,
month=10,
day=12;Bb;……};錯數(shù)據(jù)成員 成員函數(shù)名稱 含義 名稱 功能name
職員
set
設(shè)置數(shù)據(jù)成員值sex
職員
display
輸出數(shù)據(jù)成員值wage
職員工資如,定義一個職工類,該類是對所有職工某些信息的抽象,包括如下成員:classStaff{private:char
name[30];char
sex;float
wage;public:voiddisplay();};void
Staff::display(){cout<<name<<":"<<sex<<","<<wage<<endl;}void
Staff::set(char
*n,char
s,float
w){strcpy(name,n);sex=s;void
set(char
*n,char
s,float
w);
wage=w;}說明部分實現(xiàn)部分作用域運算符(類體外實現(xiàn)時需要)8.3.2對象的定義類名僅提供一種類型定義,只有在定義屬于類的變量后,系統(tǒng)才會為其預(yù)留空間,這種變量稱為對象,它是類的實例。格式:指向A類對象的指針A類的對象對象數(shù)組類名
對象名表;如,假設(shè)A是一個已定義過的類,則可定義:A
a1,*p,a[5]成員一般對象成員數(shù)據(jù)成員:成員函數(shù):<對象名>.<成員名>(<參數(shù)表>)指
象的指針的成員表示法:對象名.成員名對象名.成員名(參數(shù)表)對象指針名->成員名(*對象指針名).成員名數(shù)據(jù)成員:或成員函數(shù):對象指針名->成員名(參數(shù)表)(*對象指針名.成員名(參數(shù)表)#include
"iostream.h"#include
"string.h"class
Staff{private:char
name[30];char
sex;float
wage;public:void
display(){cout<<name<<":"<<sex<<",
"<<wage<<endl;}void
set(char
*n,char
s,float
w){strcpy(name,n);sex=s;
wage=w;}};void
main(){Staff
s,*s1;s.set(“WangQiang”,‘m’,1526);s.display();s1=&s;s1->set("GaoLing",'f',2003);s1->display();}S1為指向s的指針可修改為如下形式嗎=
“WangQiangs.sex=‘m’;s.wage=1526[例8-1]8.3.3對象的初始化1.構(gòu)造函數(shù)和析構(gòu)函數(shù)[例8-2]看引例的另一種實現(xiàn)#include"iostream.h"classCircle{private:double
x,y,r;public:voidprint(){cout<<"圓心:("<<x<<","<<y<<")"<<endl;cout<<"半徑:"<<r<<endl;}Circle(double
x1,double
y1,double
r1){x=x1;
y=y1;
r=r1;}};void
main(){Circle
p
(0,0,2);p.print();}構(gòu)造函數(shù)、同類名定義的同時初始化對象省略對賦初值成員函數(shù)的額外調(diào)用構(gòu)造函數(shù)特點是成員函數(shù),可寫在類體內(nèi),亦可寫在類體外。函數(shù)名同類名,不能指定函數(shù)類型,可以帶參數(shù)??芍剌d,即可定義多個參數(shù)個數(shù)不同的函數(shù)。在創(chuàng)建對象時由系統(tǒng)自動調(diào)用,程序中不能直接調(diào)用。析構(gòu)函數(shù)特點:是成員函數(shù),可寫在類體內(nèi),亦可寫在類體外。函數(shù)名同類名,前面多個字符“~”
,不指定類型,無參。不可重載,即一個類只能定義一個析構(gòu)函數(shù)??杀徽{(diào)用,也可由系統(tǒng)調(diào)用。系統(tǒng)自動調(diào)用情況如下:若一個對象被定義在函數(shù)體內(nèi),則當(dāng)該函數(shù)結(jié)束時,該對象的析構(gòu)函數(shù)被自動調(diào)用。當(dāng)一個對象是使用new運算符 態(tài)創(chuàng)建的,在使用delete
時,析構(gòu)函數(shù)將會被自動調(diào)用2.缺省構(gòu)造函數(shù)和缺省析構(gòu)函數(shù)形式:說明:若沒有定義任何構(gòu)造函數(shù),系統(tǒng)會自動生成上述無參的缺省構(gòu)造函數(shù)及析構(gòu)函數(shù)若定義一個靜態(tài)對象而沒有指明初始化時,編譯器會按缺省構(gòu)造函數(shù)對對象的所有數(shù)據(jù)成員都初始化為0或空。<類名>::~<缺省析構(gòu)函數(shù)名>(){
}<類名>::<缺省構(gòu)造函數(shù)名>(){
}[例8.3]
定義一個Circle1類,具有求一個圓的面積、求兩個圓的面積之和,以及輸出面積等功能
。#include"iostream.h"classCircle1{private:double
x,y,r,s;public:voidprint(){cout<<"圓心:("<<x<<","<<y<<")"<<endl;cout<<"半徑:"<<r<<endl;}Circle1(){
}Circle1(double
x1,double
y1,double
r1){
x=x1;
y=y1;
r=r1;}void
addarea(Circle1
p1,Circle1
p2){s=3.14*(p1.r*p1.r)+3.14*(p2.r*p2.r);}voiddisp(){ cout<<"面積:"<<s<<endl;}};voidmain(){Circle1
p1(0,0,2),p2(1,1,4),p3;p1.print();p2.print();p3.addarea(p1,p2);p3.disp();}可缺省嗎?驗證一下初始化了嗎#include<iostream.h>#include<conio.h>classcount{intnum;public:count();~count();voidprocess();};count::count(){num=0;}count::~count(){cout<<"字符個數(shù):"<<num<<endl;}voidcount::process(){while(cin.get()!='\n')num++;cout<<endl;
}voidmain(){count
c;cout<<"輸入一個句子:"
;cess();}[例8.4]
析構(gòu)函數(shù)示例析構(gòu)函數(shù)中輸出處理結(jié)果(未設(shè)專門輸出函數(shù))析構(gòu)函數(shù)在程序結(jié)束前由系統(tǒng)自動調(diào)用3.拷貝初始化構(gòu)造函數(shù)[例8.5]#include
"iostream.h"class
Circle1{private:double
x,y,r,s;public:void
print(){cout<<"圓心:("<<x<<","<<y<<")"<<endl;cout<<"半徑:"<<r<<endl;}Circle1(double
x1,double
y1,double
r1){ x=x1;
y=y1;
r=r1;}Circle1(
Circle1
&p){x=p.x;
y=p.y,
r=p.r;}};void
main(){Circle1
p1(0,0,2),p2(p1);p1.print();p2.print();}用于用已知對象初始化被創(chuàng)建的同類對象只有一個參數(shù),且是對某個對象的常用于做函數(shù)的形參及返回值拷貝初始化構(gòu)造函數(shù)(做參數(shù))已知對象做初值8.3.4常對象和常成員1.常成員函數(shù)形式:類型說明符 函數(shù)名(參數(shù)表)
const為const函數(shù)不修改對象數(shù)據(jù)成員的成員函數(shù)才能構(gòu)造函數(shù)和析構(gòu)函數(shù)不能 為const只有常成員函數(shù)可以操作常對象說明:[例8.6]常成員函數(shù)示例#include"iostream.h"class
Time{private:inthour,minute,second;public:Time::Time(){
}Time::Time(int
h,int
m,int
s){hour=h;
minute=m;
second=s;}void
settime(int
h,int
m,int
s){hour=h;
minute=m;
second=s;}voidprint()const{cout<<hour<<":"<<minute<<":"<<second<<endl;}};voidmain(){Time
t1;const
Time
t2(10,23,34);//定義t2為常對象t1.settime(11,15,20);t1.print();//t2.settime(4,12,15);t2.print();}前面的解釋符可去掉嗎不修改數(shù)據(jù)成員,定義為常函數(shù)settime函數(shù)可為const嗎2.常數(shù)據(jù)成員對不應(yīng)該被修改的數(shù)據(jù)成員
為const,可使其受到強制保護,初始化方式與一般數(shù)據(jù)成員不同。為常數(shù)據(jù)成員class
Decrement{private:int
num;const
int
dec;//將decpublic:Decrement(int
n,int
d):dec(d){num=n;}void
fdec(){num=num-dec;
}void
print()const{cout<<"num="<<num<<",dec="<<dec<<endl;
}};初始化列表的方式初始化6.3.5靜態(tài)成員靜態(tài)成員的提出是為了解決數(shù)據(jù)共享的問題,它比全局變量在實現(xiàn)數(shù)據(jù)共享時更為安全,是實現(xiàn)同類多個對象數(shù)據(jù)共享的好方法。在類中,分為靜態(tài)數(shù)據(jù)成員和靜態(tài)函數(shù)。1。靜態(tài)數(shù)據(jù)成員初始化格式:數(shù)據(jù)類型 類名::靜態(tài)數(shù)據(jù)成員=值是類的成員,被所有對象所共享,在內(nèi)存中只存貯一次定義或說明時前面加關(guān)鍵字static初始化在類行,不加static和權(quán)限修飾符[例8.7] 靜態(tài)數(shù)據(jù)成員示例程序、初始化的位置和限通過以下程序了解靜態(tài)數(shù)據(jù)成員的定及具有類對象共享的屬性。#include
<iostream.h>class
Tc{private:int
i;static
int
k;public:Tc(
){i=0;
i++;
k++;}void
display(){cout<<i<<","<<k;}};int
Tc::k=0;void
main(){Tc
A,B;display();display();}運行結(jié)果:靜態(tài)變量靜態(tài)變量初始化創(chuàng)建A時k值0->1創(chuàng)建B時k值1->2。1,21,22.靜態(tài)成員函數(shù)靜態(tài)成員函數(shù)中數(shù)據(jù)成員的 也有區(qū)別:[例8.8]靜態(tài)成員函數(shù)應(yīng)用程序示例靜態(tài)成員函數(shù)是類的成員函數(shù),而非對象的成員。調(diào)用形式:類名::靜態(tài)成員函數(shù)名(參數(shù)表)對靜態(tài)數(shù)據(jù)成員,直接對非靜態(tài)數(shù)據(jù)成員,通過對象#include
<iostream.h>class
Tc{private:int
A;
static
int
B;public:Tc(int
a){A=a;
B+=a;}static
void
display(Tc
C){cout<<C.A<<B;}};int
Tc::B=2;void
main(){Tc
A(2),B(4);Tc::display(A);Tc::display(B);}靜態(tài)成員函數(shù)的調(diào)用非靜態(tài)數(shù)據(jù)成員的靜態(tài)數(shù)據(jù)成員的引用通過該程序了解程序中靜態(tài)成員函數(shù)的調(diào)用方式以及靜態(tài)成員函數(shù)中靜態(tài)數(shù)據(jù)成員和非靜態(tài)數(shù)據(jù)成員的 方式8.3.6
函數(shù)void
Cpoint::print(){cout<<X<<Y
;}double
dist(Cpoint
&a,Cpoint
&b){int
dx=a.X-b.X;intdy=a.Y-b.Y;return
sqrt(dx*dx+dy*dy);}void
main(){Cpoint
p1(3,4),p2(6,8);p1.print();p2.print();double
d=dist(p1,p2);
/*不是成員函數(shù)不需對象表示,直接調(diào)用*/cout<<"Distance
is
"<<d<<endl;}函數(shù)說明前不能加friend為非成員函數(shù)可 類中私有成員說明時前面加關(guān)鍵字friend標(biāo)識[例8.9] 函數(shù)示例程序#include
<iostream.h>#include
<math.h>class
Cpoint{private:int
X,Y;public:Cpoint(int
x,
int
y){X=x;
Y=y;}void
print();friend
double
dist(Cpoint
&a,Cpoint
&b);};計算機系學(xué)生本科生系行政管理教務(wù)教師教職工8.4
繼承和派生基類(父類)派生類(子類)多繼承單繼承class
Cylinder1:public
Circle{private:double
h;public:void
print(){Circle::print();cout<<"圓柱高:"<<h<<endl;}void
set(double
x1,double
y1,double
r1,double
h1){
Circle::set(x1,y1,r1);h=h1;}};class
Cylinder{private:double
x,y,r,h;public:void
print(){cout<<"圓心:("<<x<<","<<y<<")"<<endl;cout<<"半徑:"<<r<<",圓柱高:"<<h<<endl;}void
set(double
x1,double
y1,double
r1,double
h1){
x=x1;
y=y1;
r=r1;
h=h1;}};對比如下兩個圓柱體類的定義全部數(shù)據(jù)成員重新定義只定義一個新成員(Circle中沒有)通過調(diào)用Circle類成員函數(shù)輸出Circle類成員從Circle類中派生而來8.4.2單繼承1.派生類的定義格式public(公有基類)private(私有基類)protected(保護基類)class
派生類名:
繼承方式
基類名{派生類新定義成員};若要在派生類Cylinder1中再增加一個成員函數(shù)
volume,用以求圓柱體的體積,則該成員函數(shù)能否如下實現(xiàn):double
Cylinder1::volume(){return(3.14*r*r*h);}錯!r是Circle類的私有成員,不能被派生類2.繼承方式public,private和
protected是三種常用的繼承方式,繼承方式的不同決定了派生類對基類成員的
權(quán)限不同。基類私有成員(private)公有成員(public)保護成員(protected)私有派生類(private)不可
的成員私有成員私有成員公有派生類(public)不可
的成員公有成員保護成員保護派生類(protected)不可
的成員保護成員保護成員派生類的繼承關(guān)系[例8.10]分析下列程序中的權(quán)限,并回答所提的問題。#include
<iostream.h>class
A{public:voidf1();A(
){i1=10;j1=11;}protected:intj1;private:inti1;};class
B:public
A{public:voidf2(
);B(){i2=20;j2=21;}protected:intj2;private:inti2;};class
C:public
B{public:voidf3();C(
){i3=30;j3=31;}protected:intj3;private:inti3;};voidmain(){A
a;B
b;C
c;}f2()能否
f1(),i1,j1?能
f1()、j1,不能
i1b能否
f1(),i1,j1?能
f1(),不能
i1和j1(3)
f3()能否
f2()、i2和j2以及f1(),j1和i1?f3能
f2()和j2,以及f1()和j1,但不能
i1和i2(4)c能否
f2(),i2和j2以及f1(),j1和i1?能
f2()和f1(),其它的都不能#include
"iostream.h"class
Circle{private:double
x,y,r;public:void
print(){cout<<"圓心:("<<x<<","<<y<<")";cout<<endl<<"半徑:"<<r<<endl;}void
set(double
x1,double
y1,double
r1)r=r1;
}{
x=x1;
y=y1;double
getr(){return
r;}}};void
main(){Cylinder1
p;p.set(0,0,2,3);};該函數(shù)返回值為圓半徑,為派生類能使用半徑提供一個接口class
Cylinder1:public
Circle{private:double
h;public:void
print(){Circle::print();cout<<"圓柱高:"<<h<<endl;}void
set(double
x1,double
y1,double
r1,double
h1){
Circle::set(x1,y1,r1);h=h1;}double
volume(){double
R=getr();return(3.14*R*R*h);派生類可基類公有成員p.print();cout<<"volume="<<p.volume();}[例8.11]派生類示例程序3.構(gòu)造函數(shù)和析構(gòu)函數(shù)派生類的構(gòu)造函數(shù)除了對自己的數(shù)據(jù)成員初始化外,還負責(zé)調(diào)用基類構(gòu)造函數(shù)使基類的數(shù)據(jù)成員得以初始化,當(dāng)對象被刪除時,派生類的析構(gòu)函數(shù)被執(zhí)行,同時基類的析構(gòu)函數(shù)也將被調(diào)用。格式:派生類名(派生類構(gòu)造函數(shù) 數(shù)表):基類構(gòu)造函數(shù)(參數(shù)表1){<派生類中數(shù)據(jù)成員初始化>};說明:基類中有缺省的構(gòu)造函數(shù)或沒定義構(gòu)造函數(shù),則派生類構(gòu)造函數(shù)的定義中可省略對基類構(gòu)造函數(shù)的調(diào)用,而隱式調(diào)用缺省構(gòu)造函數(shù)?;悩?gòu)造函數(shù)中,只有有參的構(gòu)造函數(shù),則派生類構(gòu)造函數(shù)中必須調(diào)用基類構(gòu)造函數(shù),提供將參數(shù)傳遞給基類構(gòu)造函數(shù)的途徑派生類構(gòu)造函數(shù)的調(diào)用順序為先基類,后派生類。派生類析構(gòu)函數(shù)的執(zhí)行順序為先派生類,后基類。#include"iostream.h"#include
"string.h"class
Staff{private:char
name[30];char
sex;floatwage;public:voiddisplay(){cout<<name<<":"<<sex<<",
"
<<age<<endl;}Staff(char
*n,char
s,float
w){
strcpy(name,n);sex=s;
wage=w;}};class
Staff1:public
Staff{private:intwt;public:}{wt=t;}double
addwage(){return(wt/10*80);}voiddisplay(){
Staff::display();cout<<wt<<",
"
<<addwage()<<end};void
main(){Staff1s("WangQiang",'m',1526,21);s.display();}[例8.12]派生類構(gòu)造函數(shù)示例程序派生類構(gòu)造函數(shù)中調(diào)用基類構(gòu)造函數(shù)Staff1(char
*n,char
s,float
w,int
t):Staff(n,s,w8.5多態(tài)性發(fā)出同樣的消息被不同類型的對象接收時導(dǎo)致完全不同的行為。函數(shù)重載(已介紹過)運算符重載基于虛函數(shù)的多態(tài)性8.5.1運算符重載賦予已有的運算符多重含義,通過重新定義運算符使它能夠用于特定類的對象以完成特定的功能。[例8.13]重載“+”運算,用以實現(xiàn)兩個字符串的連接#include
"iostream.h"#include
"string.h"#include
"stdio.h"class
Str{private:char
*s;int
len;public:Str(){
}Str(char*s1){
len=strlen(s1);s=new
char[len];strcpy(s,s1);}void
print(){cout<<s<<endl;
}Str
operator+(Str
s1){
return(strcat(s,s1.s));
}};void
main(){char
str1[100],str2[100];gets(str1);
gets(str2);Strs1(str1),s2(str2),s3;s3=s1+s2;s3.print();}對加法運算符進行重載s3=s1.operator+(s2)重載形式:重載為類的成員函數(shù):類名operator運算符(參數(shù)表)程序中表達形式:c1運算符
c2重載為類的 函數(shù):friend類名operator運算符(參數(shù)表程序中表達形式:c1運算符
c2編譯程序解釋形式:operator 運算符(c1,c2)將例8.13中的加法運算符重載為 函數(shù)的形式如下:friend
Str
operator+(Str
s1,Str
s2){return(strcat(s1.s,s2.s));}編譯程序解釋形式:隱含了指向c1的this指針c1
operator 運算符(c2)this
指針無需定義而隱含于每個類的成員函數(shù)中指向正在被某個成員函數(shù)操作的對象可以用*this來標(biāo)識調(diào)用該成員函數(shù)的對象通常情況下,程序中并不顯式地使用this指針[例8.14]自增運算符重載(this
指針使用示例)#include"iostream.h"class
A{private:intx;public:A(int
x1){x=x1;
}voidprint(){cout<<x<<endl;}A
operator++(){x++;return(*this);}};voidmain(){A
a(5);(++a).print();}返回調(diào)用成員函數(shù)的對象自身自增重載運算作用于A類對象a等價于如下兩條語句:++a;a.print();8.5.3虛函數(shù)虛函數(shù)說明方式virtual
類型說明符 函數(shù)名 (參數(shù)表)虛函數(shù)是動態(tài)聯(lián)編的基礎(chǔ),它是一種非static的成員函數(shù)實現(xiàn)動態(tài)聯(lián)編的條件基類中有說明的虛函數(shù)調(diào)用虛函數(shù)操作的只能是對象指針或?qū)ο?/p>
,否則仍為靜態(tài)聯(lián)編[例8.15]虛函數(shù)示例程序#include"iostream.h"class
Animal{public:voidcharacter(){cout<<"動物特征:不同.\n";}virtualfood(){cout<<"動物食物:不同.\n";}};class
Giraffe:public
Animal{public:voidcharacter(){cout<<"長頸鹿特征:長頸.\n";}virtualfood(){cout<<"長頸鹿食物:樹葉.\n";}};class
Elephant:public
Animal{public:voidcharacter(){cout<<"大象特征:長鼻子.\n";}virtualfood(){cout<<"大象食物:草.\n";}};void
f(Animal
*p)//形參數(shù)基類指針{p->character();p->food();}void
main(){Giraffe
g;f(&g);
//實參為派生類對象的地址Elephante;f(&e);
//實參為派生類對象的地址}觀察運行結(jié)果voidf(Animal
&p)//形參為基類對象的{p.character();p.food();}voidmain(){Giraffe
g;f(g);//實參為派生類對象
Elephant
e;f(e); //實參為派生類對象}void
f(Animal
p)//形參為基類對象{p.character();p.food();}void
main(){Giraffeg;f(g);//實參為派生類對象
Elephant
e;f(e); //實參為派生類對象}若將程序的相應(yīng)部分修改為如下兩種形式,再觀察運行結(jié)果從上述程序中可見:只有當(dāng)虛函數(shù)操作的是指 象的指針或是對象的
時,對該虛函數(shù)調(diào)用采取的才是動態(tài)聯(lián)編。虛函數(shù)使用說明:派生類中的虛函數(shù)應(yīng)與基類中的虛函數(shù)具有相同的名稱、參數(shù)個數(shù)及參數(shù)類型??梢灾粚⒒愔械某蓡T函數(shù)顯式地說明為虛函數(shù),而派生類中的同名函數(shù)也隱含為虛函數(shù)。1.純虛函數(shù)是一種沒有函數(shù)體特殊的虛函數(shù),當(dāng)在基類中不能對虛函數(shù)給出有意義的實現(xiàn),而將其說明為純虛函數(shù),它的實現(xiàn)留給派生類去做。格式:8.5.4抽象類virtual
類型
函數(shù)名
(參數(shù)表)=0;2.抽象類是帶有純虛函數(shù)的特殊類,主要作用是將有關(guān)的子類組織在一個繼承層次結(jié)構(gòu)中,由它來為它們提供一個公共的根。只能用作其它類的基類,不能建立抽象類對象可說明抽象類指針和
,指向其派生類,進而實現(xiàn)多態(tài)性。不能用作參數(shù)類型、函數(shù)返回類型或強制轉(zhuǎn)換的類型。[例8.16]抽象類示例程序#include
<iostream.h>#include
<math.h>class
base{protected:int
x,y;public:virtual
void
setx(int
i,int
j=0){x=i;
y=j;}virtual
void
disp()=0;};class
square:
public
base{public:void
disp(){cout<<x*x<<endl;}};class
cube:
public
base{public:void
disp(){cout<<x*x*x<<endl;}};class
chpow:
public
base{public:void
disp(){cout<<pow(x,y);}};void
main(){base
*ptr;square
B;cube
C;chpowD;ptr=&B;ptr->setx(5);ptr->disp();ptr=&C;ptr->setx(6);ptr->disp();ptr=&D;ptr->setx(3,4);ptr->disp();}抽象類指針派生類抽象類指針指向不同的派生類對象B、C、D,實現(xiàn)多態(tài)性8.6程序舉例類名數(shù)據(jù)成員成員函數(shù)vehicle名稱含義名稱功能wheels車輪個數(shù)vehicle初始化數(shù)據(jù)成員weight車重getwheels、getweight分別獲得各數(shù)據(jù)成員值print輸出各數(shù)據(jù)成員值truckwheelsweight基類vehicle類成員truck初始化數(shù)據(jù)成員的值(通過調(diào)用基類的構(gòu)造函數(shù)初始化基類成員)payload載重量efficiency求卡車的載重效率print輸出數(shù)據(jù)成員的值(通過調(diào)用基類的print函數(shù)輸出基類成員的值)[例8.17]定義一
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 微信平臺推廣合同協(xié)議
- 快消品代運營合同協(xié)議
- 2025鋁材購銷合同的格式范本
- 2025標(biāo)準(zhǔn)貨物運輸合同模板
- 快遞門市轉(zhuǎn)讓合同協(xié)議
- 模具沖壓件合同協(xié)議
- 2025共有產(chǎn)權(quán)房的買賣合同
- 商業(yè)合作保密協(xié)議合同
- 品牌代理招商合同協(xié)議
- 2025國內(nèi)獨家授權(quán)合同
- 傳熱學(xué)第5章-對流換熱的理論基礎(chǔ)
- 裝修箭牌衛(wèi)浴報價
- GB/T 33084-2016大型合金結(jié)構(gòu)鋼鍛件技術(shù)條件
- 人教版六年級英語下冊recycle-Day3Day4-課件
- 2022年江蘇泰州市第四人民醫(yī)院招考聘用高層次人才11人(必考題)模擬卷及答案
- 新加坡sm214th面經(jīng)44踏水行歌
- 產(chǎn)科輸血-ppt課件
- 國家職業(yè)技能標(biāo)準(zhǔn) (2021年版) 公共營養(yǎng)師
- 多合規(guī)政策及流程變化對照版
- 鋼箱梁的制作及安裝方案
- 工程測量畢業(yè)設(shè)計畢業(yè)論文
評論
0/150
提交評論