1. 程式人生 > >C++中編譯期多型機制和執行期多型機制之間的區別

C++中編譯期多型機制和執行期多型機制之間的區別

函式由函式名、引數個數、引數型別、返回值和呼叫方式等組成。

函式簽名:把函式名去掉之後函式的剩餘部分(引數個數、引數型別、返回值和呼叫方式等)。

頂層函式:在類之外宣告並定義的函式稱為頂層函式。

成員函式:在類的宣告中宣告的函式稱為類的成員函式。

過載:如果頂層函式有不同的引數,它們的函式名可以相同;在一個類中,成員函式可以有相同的函式名,只要它們的函式簽名不同即可,我們將這種情況成為過載。

過載編譯期繫結相對應,不管是成員函式還是頂層函式。

多型函式指的是在執行期進行繫結的函式,在C++中,僅有虛擬函式是在執行期進行繫結的,因此僅有虛擬函式才具有真正意義上的多型。

程式碼用例如下

class C{
public:
	C(){/*...*/}          //default constructor
	C(int x){/*...*/}     //convert constructor	
};

void f(double d){/*...*/}
void f(char c){/*...*/}

int main(){
	C c1;      //default constructor called  
	C c2(26);  //convert constructor called
	f(3.14);   //f(double d) called
	f('Z');    //f(char c) called
	//...
}
在上面的程式碼段中,有兩個名為f的頂層函式和兩個名為c的建構函式。對於這四個函式而言,編譯器使用的都是編譯期繫結。編譯器依據函式簽名來進行繫結,因此由於建立物件c1時沒有指定初值,編譯器呼叫預設建構函式,而建立物件c2時指定了一個整型的初值,編譯器呼叫轉型建構函式。

同樣,編譯器將下面的呼叫

f(3.14);

繫結到以單個double型為引數的f函式上,而對呼叫

f('Z');

則繫結到以單個字元char型為引數的f函式上。

在進行過載時,總是使用編譯期繫結,在這方面過載函式(不管是成員函式還是頂層函式)和虛擬函式是截然不同的,虛擬函式總是在執行期繫結的。