回覆列表
-
1 # Gfilsxin
-
2 # 三袋大菠蘿
編譯成彙編之後是一個虛擬函式表,函式都是用地址表示的,類似C語言的函式指標。
把函式做成成員變數就是類似的多型過載。
而模板類更像是宏,不同型別的輸入輸出,相同的處理邏輯,編譯之後會變成很多類。
編譯成彙編之後是一個虛擬函式表,函式都是用地址表示的,類似C語言的函式指標。
把函式做成成員變數就是類似的多型過載。
而模板類更像是宏,不同型別的輸入輸出,相同的處理邏輯,編譯之後會變成很多類。
首先要明確什麼是多型:
多型就是一個名字或符號具有多種含義,透過過載來實現。有函式過載和運算子過載兩種。
編譯是靜態的,函式過載是靜態多型性的具體示例,程式碼在編譯完就已經決定出同一個介面用哪種實現,這就是編譯期多型。
執行時多型的,虛擬函式是動態多型性的具體示例。直到程式執行時,拿到CPU暫存器裡的指標了,才知道這個指標究竟指向父類還是繼承類的虛擬函式實現,這就是執行期的多型了。
也就是說,普通的成員函式,在編譯時呼叫關係就已經確定了,而虛擬函式,需要在執行時,才能根據物件指標指向的是父類還是繼承類,來決定呼叫哪一個實現,我們看看下面的類定義:
class father
{
virtual testVfunc(){
std::cout<<"father testVfunc run"<<std::endl;
}
}
class child : public father
{
virtual testVfunc(){
std::cout<<"child testVfunc run"<<std::endl;
}
定義兩個物件:father pFather=new father();
child pChild=new child();這兩個物件在記憶體中
有一個vptl指標,分別指向自己實現的函式,這樣程式在執行到虛擬函式時,就會查詢這個指標具體指向的地址空間,執行自己的實現函式。
注,泛型是一種特殊形式的靜態多型,實現方式是型別引數化。使用模板機制的程式設計就是泛型程式設計。