在c++中,多型性主要是通過函式過載實現的。過載函式是指程式中對同名函式進行呼叫時,編譯器會根據函式引數的型別和個數,決定該呼叫哪一段函式**來處理這個函式呼叫。這種把函式呼叫與適當的函式**相對應的動作,叫做聯編。
聯編分為靜態聯編和動態聯編。
在編譯階段決定執行哪個同名的被呼叫函式,稱為靜態聯編。
在編譯階段不能決定執行哪個同名的被呼叫函式,只在執行階段才能依據要處理的物件型別來決定執行哪個類的成員函式,這稱為動態聯編。
多型性也分為靜態和動態兩種。靜態多型性是指定義在乙個類或乙個函式中的同名函式,它們可根據參數列(型別及個數)區別語義,並通過靜態聯編實現,例如在乙個類中定義不同引數的建構函式以及運算子的過載等。動態多型性是指定義在乙個類層次的不同類中的過載函式,它們一般具有相同的參數列,因而要根據指標指向的物件所在類來區別語義,它通過動態聯編實現。 例:
class point
double area() const
private:
double x,y; };
class rectangle : public point
double area() const
private:
double w,h; };
void fun(point &s)
void main()
該程式的結果為0
s所引用的物件執行的area()操作被關聯到point::area()的實現**上。因為預設靜態聯編。在程式的編譯階段,對s所引用的物件所執行的area()操作只能是point類的函式上。
虛函式是動態聯編的基礎,它是引入派生概念之後用來表現基類和派生類成員函式之間的一種關係。虛函式在基類中定義,它也是一種成員函式,而且是非靜態成員函式。
1. 虛函式的說明
說明虛函式的方法如下:
virtual
《型別說明符》《函式名》(《參數列》)
關鍵字virtual說明的函式稱為虛函式。這就意味著該成員函式在派生類中可能有不同的實現。當使用這個成員函式操作指標或引用所標識物件來操作虛函式,對該成員函式呼叫採取動態聯編方式,即在執行時進行關聯或束定。
動態聯編只能通過指標或引用標識物件來操作虛函式,如果採用一般型別的標識物件來操作虛函式,則將採用靜態聯編方式呼叫虛函式。(一般型別的標識物件指什麼?)例:
#include
class point
virtual double area() const
private:
double x,y; };
classrectangle:public point
virtual double area() const
private:
double w,h; };
void fun(point&s)
void main()
這時,程式按意圖來執行了。
2.虛函式的限制
1)只有類的成員函式才能說明為虛函式。因為,虛函式僅適用於有繼承關係的類物件,所以普通函式不能說明為虛函式。
2) 靜態成員函式不能是虛函式。因為,靜態成員函式不受限於某個物件。
3) 內聯函式不能是虛函式,因為內聯函式是不能在執行中動態聯編的。即使虛函式在類的內部定義,編譯時仍將其看作非內聯的。
4) 建構函式不能是虛函式,因為構造時物件還是一片未定型的空間。只有在構造完成後,物件才能成為乙個類的例項。
5) 析構函式可以是虛函式,而且通常說明為虛函式。說明虛函式的目的在於:使用delete運算子刪除乙個物件時,能確保析構函式被正確的執行。設定虛析構函式後,可以利用動態聯編方式選擇析構函式。
動態聯編與靜態聯編
首先,聯編是指乙個電腦程式的不同部分彼此關聯的過程。靜態聯編是指聯編工作在編譯階段完成的,這種聯編過程是在程式執行之前完成的,又稱為早期聯編。要實現靜態聯編,在編譯階段就必須確定程式中的操作呼叫 如函式呼叫 與執行該操作 間的關係,確定這種關係稱為束定,在編譯時的束定稱為靜態束定。靜態聯編對函式的選...
動態聯編與靜態聯編
include using namespace std class base 輸出為 f1 of base destructor base f1 of derive destructor base 說明 只要將基類的函式設定為虛函式,那麼所有覆蓋它的子類的函式也都是虛函式,而不需要再使用virtua...
c 動態聯編與靜態聯編
摘要 本文闡述了靜態聯編和動態聯編的概念和區別,通過具體例項分析了實現動態聯編的條件,指出了虛函式是實現動態聯編的基礎。在c 中,聯編是指乙個電腦程式的不同部分彼此關聯的過程。按照聯編所進行的階段不同,可分為兩種不同的聯編方法 靜態聯編和動態聯編。1.靜態聯編 靜態聯編是指聯編工作在編譯階段完成的,...