多型性與虛函式

2021-07-04 02:40:36 字數 3167 閱讀 9232

1.  函式過載(overloading)與靜態聯編(static binding)

函式過載(

overloading)

指的是,允許多個不同函式使用同乙個函式名,但要求這些同名函式具有不同的參數列。

. 參數列中的引數個數不同;

. 參數列中對應的引數型別不同;

. 參數列中不同型別引數的次序不同。  例:

intabs(

intn)

float

abs(floatn) 

系統對函式過載這種多型性的分辨與處理,是在編譯階段完成的 --

靜態聯編(

static binding)。

2  函式超載(

overriding)、

虛函式(

virtual function)

及動態聯編(

dynamic binding)

(1)

函式超載(

overriding)

. 僅在基類與其派生類的範圍內實現;

. 允許多個不同函式使用完全相同的函式名、函式引數表以及函式返回型別;

(2)虛函式(

virtual function)

. 在定義某一基類(或其派生類)時,若將其中的某一函式成員的屬性說明為

virtual,

則稱該函式為

虛函式(

virtual function)。

. 虛函式的使用與函式超載密切相關。若基類中某函式被說明為虛函式,則意味著其派生類中也要用到與該函式同名、同參數列、同返回型別、但函式(實現)體不同的這同乙個所謂的超載函式。 

class

graphelem

virtualvoid draw();   //

虛函式draw,

每乙個類都要

「draw

」出屬於它的類物件圖形 };

class

line:public

graphelem

;  //

虛函式draw,

負責畫出

「line」

... };

class

circle:public

graphelem

;  //

虛函式draw,

負責畫出

「circle」

... };

class

********:public

graphelem

;  //

虛函式draw,

負責畫出

「********」

... };

(3)動態聯編(

dynamic binding)

與虛函式以及程式中使用指向基類的指標(變數)密切相關。

注意:c++規定,

基類指標可以指向其派生類的物件

(也即,可將派生類物件的位址賦給其基類指標變數),但反過來不可以。這一點正是函式超載及虛函式用法的基礎。

例1.建立上述類

line、

類circle

以及類********

的類物件,而後呼叫它們各自的

draw函式「

畫出」它們。

方法1:

直接通過類物件(由類物件可以唯一確定要呼叫哪乙個類的

draw

函式)

line ln1;  circle cir1;   ******** tri1;

ln1.draw(); 

cir1.draw(); 

tri1.draw(); 

方法2:

使用指向基類的指標(動態聯編,要靠執行程式時其基類指標的「動態

」取值來確定呼叫哪乙個類的

draw

函式)

graphelem

*pobj;

line ln1;  circle cir1;  ******** tri1;

pobj

=&lin1;   

pobj

->draw();

pobj

=&cir1;   

pobj

->draw(); 

pobj

=&tri1;   

pobj

->draw();

例2.假設inte_algo

為基類,其中說明了乙個虛函式

integrate,

並在其三個派生類中,也說明了該虛函式

integrate(

使用不同方法計算定積分)。

那麼,可使用函式

integratefunc

來實現呼叫不同虛函式

integrate

的目的:

void

integratefunc

(inte_algo

* p)

主調函式處使用:

integratefunc

( <

某派生類的類物件位址》 ); 

在編譯階段,系統無法確定究竟要呼叫哪乙個派生類的

integrate。

此種情況下,將採用

動態聯編方式

來處理:在執行階段,通過

p指標的當前值,去動態地確定物件所屬類,而後找到對應虛函式。

3  純虛函式與抽象基類

如果不準備在

基類的虛函式

中做任何事情,則可使用如下的格式將該虛函式說明成

純虛函式:

virtual<

函式原型》=0;

純虛函式不能被直接呼叫,它只為其派生類的各虛函式規定了乙個一致的

「原型規格

」(該虛函式的實現將在它的派生類中給出)。

含有純虛函式的基類稱為

抽象基類

。注意,不可使用抽象基類來說明並建立它自己的物件,只有在建立其派生類物件時,才有抽象基類自身的例項伴隨而生。

實際上,抽象基類是其各派生類之共同點的乙個抽象綜合,通過它,再「加上

」各派生類的特有成員以及對基類中那一純虛函式的具體實現,方可構成乙個具體的實用型別。

另外:如果乙個抽象基類的派生類中沒有定義基類中的那一純虛函式、而只是繼承了基類之純虛函式的話,則這個派生類還是乙個抽象基類(其中仍包含著繼承而來的那乙個純虛函式)。

虛函式與多型性

實驗內容 定義基類base,其資料成員為高h,定義成員函式disp 為虛函式,由基類派生出長方體類和圓柱類,並在兩個派生類中定義成員函式disp 為虛函式。在主函式中,用基類base定義指標p,用指標p動態呼叫虛函式disp 顯示面積。虛函式 它是基類中的成員函式,並在派生類中被過載。派生類中的虛函...

虛函式與多型性

include stdafx.h include using namespace std class animal void sleep void breathe class fish public animal void fn animal pan int tmain int argc,tchar...

虛函式與多型性

1 概念 多型性是物件導向語言的乙個重要性質,虛函式是幫助c 實現多型性的技術。多型性體現在可以 使用基類的指標呼叫派生類的同名函式。前提是基類的同名函式是virtual的。2 例子 例如 class tool tool virtual use class pen public tool pen u...