復習-第八章面向?qū)ο蟪绦蛟O計_第1頁
復習-第八章面向?qū)ο蟪绦蛟O計_第2頁
復習-第八章面向?qū)ο蟪绦蛟O計_第3頁
復習-第八章面向?qū)ο蟪绦蛟O計_第4頁
復習-第八章面向?qū)ο蟪绦蛟O計_第5頁
免費預覽已結束,剩余50頁可下載查看

下載本文檔

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

文檔簡介

第八章面象程序設計象程序設計概述面結構類和對象繼承和派生多態(tài)性程序舉例8.1面象程序設計(OOP)概述Object

Oriented

Programming基本概念對象:現(xiàn)實世界的實體,每個對象都有所屬的類類:

對一組對象共同具有的屬性和行為的抽象,具有封裝和隱藏性、還具有繼承性。消息:向某對象請求服務的一種表達方式,是對象與外界、對象與其它對象之間聯(lián)系的工具方法:對某對象接受消息后所采取的操作的描述。特點封裝性C++中,通過類和對象實現(xiàn)對數(shù)據(jù)的封裝,使得程序的修改維護更方便。是OOP的基礎。繼承性連接類與類的層次模型,利用現(xiàn)有類派生出新類的過程稱為類繼承,支持代碼重用、提供了無限重復利用程序資源的途徑、節(jié)省程序開發(fā)的時間和資源,是OOP的關鍵。多態(tài)性發(fā)出同樣的消息被不同類型的對象接收時導致完全不同的行為,是OOP的重要補充說明結構類型的關鍵字8.2結構C++中的類從C語言中的結構概念演變而來結構類型說明形式struct

結構類型標識符{結構成員1;結構成員2;┆結構成員n;};類型可任意(不能為該結構自身)struct

date{int

month;int

day;int

year;};struct

man{char

name[15];char

sex;int

age;date

birthday;};如,說明一個結構類型date,含三個整型數(shù)據(jù)成員在此基礎上,又可說明另一個結構類型manNamesexagebirthdaymonthdayyearstruct

man結構類型結構變量定義struct

man man1,

man2;先說明結構類型再定義結構變量在說明結構數(shù)據(jù)類型的同時定義結構變量省略結構標識符直接定義結構類型變量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;無類型名變量結構變量的形式:結構變量名.成員名或

(*指向結構的指針).成員名指向結構的指針->成員名或通過指向結構的指針結構變量成員成員

運算符優(yōu)先級最高的四個運算符之一括號不能少strcpy

(,

"Fang

Min");p->birthday.month

=

8;如,假設有定義manm,*p=&m;則可如下

結構成員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類將圓的屬性(圓心坐標和半徑)和操作(print、set)封裝在一起上述定義的Circle類實際上也相當于一種新的數(shù)據(jù)類型,包含了數(shù)據(jù)和對數(shù)據(jù)的操作,其成員描述如下:數(shù)據(jù)成員成員函數(shù)名稱含義名稱功能x圓心坐標x值set設置數(shù)據(jù)成員值y圓心坐標y值print輸出數(shù)據(jù)成員值r圓半徑8.3.1類的定義class

類名{public:<成員函數(shù)或數(shù)據(jù)成員的說明>;private:<成員函數(shù)或數(shù)據(jù)成員的說明>;protected:<成員函數(shù)或數(shù)據(jù)成員的說明>;};<各成員函數(shù)的實現(xiàn)>類是一種復雜的數(shù)據(jù)類型,它是將不同類型的數(shù)據(jù)和與這些數(shù)據(jù)相關的運算封裝在一起的集合體,類的結構是用來確定一類對象的行為,而這些行為是通過類的數(shù)據(jù)結構和相關的操作來確定的。定義格式:

定義類的關鍵字說明部分實現(xiàn)部分訪問權限修飾符說明:定義包括說明部分

部分。若成員函數(shù)在說明部分已定義,則實現(xià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ù)據(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)才會為其預留空間,這種變量稱為對象,它是類的實例。格式:指向A類對象的指針A類的對象對象數(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.構造函數(shù)和析構函數(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();}構造函數(shù)、同類名定義的同時初始化對象省略對賦初值成員函數(shù)的額外調(diào)用構造函數(shù)特點是成員函數(shù),可寫在類體內(nèi),亦可寫在類體外。函數(shù)名同類名,不能指定函數(shù)類型,可以帶參數(shù)。可重載,即可定義多個參數(shù)個數(shù)不同的函數(shù)。在創(chuàng)建對象時由系統(tǒng)自動調(diào)用,程序中不能直接調(diào)用。析構函數(shù)特點:是成員函數(shù),可寫在類體內(nèi),亦可寫在類體外。函數(shù)名同類名,前面多個字符“~”

,不指定類型,無參。不可重載,即一個類只能定義一個析構函數(shù)。可被調(diào)用,也可由系統(tǒng)調(diào)用。系統(tǒng)自動調(diào)用情況如下:若一個對象被定義在函數(shù)體內(nèi),則當該函數(shù)結束時,該對象的析構函數(shù)被自動調(diào)用。當一個對象是使用new運算符 態(tài)創(chuàng)建的,在使用delete

時,析構函數(shù)將會被自動調(diào)用2.缺省構造函數(shù)和缺省析構函數(shù)形式:說明:若沒有定義任何構造函數(shù),系統(tǒng)會自動生成上述無參的缺省構造函數(shù)及析構函數(shù)若定義一個靜態(tài)對象而沒有指明初始化時,編譯器會按缺省構造函數(shù)對對象的所有數(shù)據(jù)成員都初始化為0或空。<類名>::~<缺省析構函數(shù)名>(){

}<類名>::<缺省構造函數(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]

析構函數(shù)示例析構函數(shù)中輸出處理結果(未設專門輸出函數(shù))析構函數(shù)在程序結束前由系統(tǒng)自動調(diào)用3.拷貝初始化構造函數(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ù)的形參及返回值拷貝初始化構造函數(shù)(做參數(shù))已知對象做初值8.3.4常對象和常成員1.常成員函數(shù)形式:類型說明符 函數(shù)名(參數(shù)表)

const為const函數(shù)不修改對象數(shù)據(jù)成員的成員函數(shù)才能構造函數(shù)和析構函數(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ù)成員對不應該被修改的數(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)存中只存貯一次定義或說明時前面加關鍵字static初始化在類行,不加static和權限修飾符[例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();}運行結果:靜態(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ù)應用程序示例靜態(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ù)可 類中私有成員說明時前面加關鍵字friend標識[例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);};計算機系學生本科生系行政管理教務教師教職工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是三種常用的繼承方式,繼承方式的不同決定了派生類對基類成員的

權限不同?;愃接谐蓡T(private)公有成員(public)保護成員(protected)私有派生類(private)不可

的成員私有成員私有成員公有派生類(public)不可

的成員公有成員保護成員保護派生類(protected)不可

的成員保護成員保護成員派生類的繼承關系[例8.10]分析下列程序中的權限,并回答所提的問題。#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.構造函數(shù)和析構函數(shù)派生類的構造函數(shù)除了對自己的數(shù)據(jù)成員初始化外,還負責調(diào)用基類構造函數(shù)使基類的數(shù)據(jù)成員得以初始化,當對象被刪除時,派生類的析構函數(shù)被執(zhí)行,同時基類的析構函數(shù)也將被調(diào)用。格式:派生類名(派生類構造函數(shù) 數(shù)表):基類構造函數(shù)(參數(shù)表1){<派生類中數(shù)據(jù)成員初始化>};說明:基類中有缺省的構造函數(shù)或沒定義構造函數(shù),則派生類構造函數(shù)的定義中可省略對基類構造函數(shù)的調(diào)用,而隱式調(diào)用缺省構造函數(shù)?;悩嬙旌瘮?shù)中,只有有參的構造函數(shù),則派生類構造函數(shù)中必須調(diào)用基類構造函數(shù),提供將參數(shù)傳遞給基類構造函數(shù)的途徑派生類構造函數(shù)的調(diào)用順序為先基類,后派生類。派生類析構函數(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]派生類構造函數(shù)示例程序派生類構造函數(shù)中調(diào)用基類構造函數(shù)Staff1(char

*n,char

s,float

w,int

t):Staff(n,s,w8.5多態(tài)性發(fā)出同樣的消息被不同類型的對象接收時導致完全不同的行為。函數(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來標識調(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)編的基礎,它是一種非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);

//實參為派生類對象的地址}觀察運行結果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); //實參為派生類對象}若將程序的相應部分修改為如下兩種形式,再觀察運行結果從上述程序中可見:只有當虛函數(shù)操作的是指 象的指針或是對象的

時,對該虛函數(shù)調(diào)用采取的才是動態(tài)聯(lián)編。虛函數(shù)使用說明:派生類中的虛函數(shù)應與基類中的虛函數(shù)具有相同的名稱、參數(shù)個數(shù)及參數(shù)類型。可以只將基類中的成員函數(shù)顯式地說明為虛函數(shù),而派生類中的同名函數(shù)也隱含為虛函數(shù)。1.純虛函數(shù)是一種沒有函數(shù)體特殊的虛函數(shù),當在基類中不能對虛函數(shù)給出有意義的實現(xiàn),而將其說明為純虛函數(shù),它的實現(xiàn)留給派生類去做。格式:8.5.4抽象類virtual

類型

函數(shù)名

(參數(shù)表)=0;2.抽象類是帶有純虛函數(shù)的特殊類,主要作用是將有關的子類組織在一個繼承層次結構中,由它來為它們提供一個公共的根。只能用作其它類的基類,不能建立抽象類對象可說明抽象類指針和

,指向其派生類,進而實現(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)用基類的構造函數(shù)初始化基類成員)payload載重量efficiency求卡車的載重效率print輸出數(shù)據(jù)成員的值(通過調(diào)用基類的print函數(shù)輸出基類成員的值)[例8.17]定義一

溫馨提示

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

評論

0/150

提交評論