C++中編譯期多型機制和執行期多型機制之間的區別
阿新 • • 發佈:2019-02-18
函式由函式名、引數個數、引數型別、返回值和呼叫方式等組成。
函式簽名:把函式名去掉之後函式的剩餘部分(引數個數、引數型別、返回值和呼叫方式等)。
頂層函式:在類之外宣告並定義的函式稱為頂層函式。
成員函式:在類的宣告中宣告的函式稱為類的成員函式。
過載:如果頂層函式有不同的引數,它們的函式名可以相同;在一個類中,成員函式可以有相同的函式名,只要它們的函式簽名不同即可,我們將這種情況成為過載。
過載與編譯期繫結相對應,不管是成員函式還是頂層函式。
多型函式指的是在執行期進行繫結的函式,在C++中,僅有虛擬函式是在執行期進行繫結的,因此僅有虛擬函式才具有真正意義上的多型。
程式碼用例如下
在上面的程式碼段中,有兩個名為f的頂層函式和兩個名為c的建構函式。對於這四個函式而言,編譯器使用的都是編譯期繫結。編譯器依據函式簽名來進行繫結,因此由於建立物件c1時沒有指定初值,編譯器呼叫預設建構函式,而建立物件c2時指定了一個整型的初值,編譯器呼叫轉型建構函式。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(3.14);
繫結到以單個double型為引數的f函式上,而對呼叫
f('Z');
則繫結到以單個字元char型為引數的f函式上。
在進行過載時,總是使用編譯期繫結,在這方面過載函式(不管是成員函式還是頂層函式)和虛擬函式是截然不同的,虛擬函式總是在執行期繫結的。