摘要】:本文闡述了靜態聯編和動態聯編的概念和區別,通過具體例項分析了實現動態聯編的條件,指出了虛函式是實現動態聯編的基礎。
在c++
中,聯編是指乙個電腦程式的不同部分彼此關聯的過程。按照聯編所進行的階段不同,可分為兩種不同的聯編方法:靜態聯編和動態聯編。
1.
靜態聯編
靜態聯編是指聯編工作在編譯階段完成的,這種聯編過程是在程式執行之前完成的,又稱為早期聯編。要實現靜態聯編,在編譯階段就必須確定程式中的操作呼叫(如函式呼叫)與執行該操作**間的關係,確定這種關係稱為束定,在編譯時的束定稱為靜態束定。靜態聯編對函式的選擇是基於指向物件的指標或者引用的型別。其優點是效率高,但靈活性差。
例1:靜態聯編
#include"iostream.h"
class a
}; classb:publica
; void main()
該程式的執行結果為:
a a從例1
程式的執行結果可以看出,通過物件指標進行的普通成員函式的呼叫,僅僅與指標的型別有關,而與此刻指標正指向什麼物件無關。要想實現當指標指向不同物件時執行不同的操作,就必須將基類中相應的成員函式定義為虛函式,進行動態聯編。
2.動態聯編
動態聯編是指聯編在程式執行時動態地進行,根據當時的情況來確定呼叫哪個同名函式,實際上是在執行時虛函式的實現。這種聯編又稱為晚期聯編,或動態束定。動態聯編對成員函式的選擇是基於物件的型別,針對不同的物件型別將做出不同的編譯結果。
c++中一般情況下的聯編是靜態聯編,但是當涉及到多型性和虛函式時應該使用動態聯編。動態聯編的優點是靈活性強,但效率低。
動態聯編規定,只能通過指向基類的指標或基類物件的引用來呼叫虛函式,其格式為:指向基類的指標變數名
->
虛函式名(實參表)或基類物件的引用名
.虛函式名(實參表)
實現動態聯編需要同時滿足以下三個條件:
①
必須把動態聯編的行為定義為類的虛函式。
②類之間應滿足子型別關係,通常表現為乙個類從另乙個類公有派生而來。
③必須先使用基類指標指向子型別的物件,然後直接或者間接使用基類指標呼叫虛函式。例2
:動態聯編
#include"iostream.h"
classa
};classb:publica
;voidmain()
該程式的執行結果為:
a b從例2
程式的執行結果可以看出,將基類
a中的函式
f定義為虛函式後,當指標指向不同物件時執行了不同的操作,實現了動態聯編。
3.
動態聯編分析
動態聯編要求派生類中的虛函式與基類中對應的虛函式具有相同的名稱、相同的引數個數和相同的對應引數型別、返回值或者相同,或者都返回指標或引用,並且派生類虛函式所返回的指標或引用的基型別是基類中虛函式所返回的指標或引用的基型別的子型別。如果不滿足這些條件,派生類中的虛函式將丟失其虛特性,在呼叫時進行靜態聯編。例3
:通過指向基類的指標來呼叫虛函式
#include"iostream.h"
class base
;class derived:public base
該程式的執行結果:
derived fun1 base fun2 base fun3 base fun4
本例中函式fun1在基類base和派生類derived中均使用了關鍵字virtual定義為虛函式,並且這兩個虛函式具有相同的引數個數、引數型別和返回值型別。因此,當指標pb訪問fun1函式時,採用的是動態聯編。函式fun2在基類base和派生類de-rived中定義為虛函式,但這兩個虛函式具有不
同的引數個數。函式
fun2
丟失了其虛特性,在呼叫時進行靜態聯編。函式
fun3
在基類base
中說明為一般函式,在派生類
derived
中定義為虛函式。在這種情況下,應該以基類中說明的成員函式的特性為標準,即函式
fun3
是一般成員函式,在呼叫時採用靜態聯編。函式
fun4
在基類base
和派生類
derived
中均說明為一般函式,因此基類指標
pb只能訪問
base
中的成員。
例4:通過基類物件的引用來呼叫虛函式
#include"iostream.h"
class cpoint
virtual double area()
private:
doublex,y;
};class crectangle:public cpoint
private:
double w,h;};
crectangle::crectangle(double i
,double j
,double k
,double l):cpoint(i,j)
void fun(cpoint &s)
該程式的執行結果為:
375例
4中的成員函式
area
在基類cpoint
中使用了關鍵字
virtual
定義為虛函式,在派生類
crectangle
中定義為一般函式,但是進行了動態聯編,結果為
15*25
即375
。這是因為乙個虛函式無論被公有繼承多少次,它仍然保持其虛特性。在派生類中重新定義虛函式時,關鍵字
virtual
可以寫也可不寫,但為了保持良好的程式設計風格,避免引起混亂時,應寫上該關鍵字。
4. 小結
從以上四個例子中可以看出:虛函式是實現多型的基礎,是實現動態聯編的必要條件之一。動態聯編要靠虛函式來實現,虛函式要靠動態聯編的支援。兩者相輔相成,缺一不可。
C 動態聯編與靜態聯編
加入自己一些理解.在c 中,聯編是指乙個電腦程式的不同部分彼此關聯的過程。按照聯編所進行的階段不同,可分為兩種不同的聯編方法 靜態聯編和動態聯編。1.靜態聯編 靜態聯編是指聯編工作在編譯階段完成的,這種聯編過程是在程式執行之前完成的,又稱為早期聯編。要實現靜態聯編,在編譯階段就必須確定程式中的操作呼...
C 靜態聯編與動態聯編
目錄 基本概念 舉個栗子 聯編 就是將模組或者函式合併在一起生成可執行 的處理過程 函式呼叫 按照聯編所進行的階段不同,可分為兩種不同的聯編方式 靜態聯編和動態聯編。函式呼叫和實現的過程 c 只有用到多型才會用到動態連編 程式設計師是看不出來的,只是系統內部的處理 程式在編譯的時候,就知道某個類呼叫...
C 動態聯編與靜態聯編
在c 中,聯編是指乙個電腦程式的不同部分彼此關聯的過程。按照聯編所進行的階段不同,可分為兩種不同的聯編方法 靜態聯編和動態聯編。1.靜態聯編 靜態聯編是指聯編工作在編譯階段完成的,這種聯編過程是在程式執行之前完成的,又稱為早期聯編。要實現靜態聯編,在編譯階段就必須確定程式中的操作呼叫 如函式呼叫 與...