C 虛函式能不能模板化

2021-09-24 19:16:09 字數 615 閱讀 8055

虛函式不能模板化

編譯器在編譯乙個類的時候,需要確定這個類的虛函式表的大小。一般來說,如果乙個類有n個虛函式,它的虛函式表的大小就是n,如果按位元組算的話那麼就是4*n。

如果允許乙個成員模板函式為虛函式的話,因為我們可以為該成員模板函式例項化出很多不同的版本,也就是可以例項化出很多不同版本的虛函式,那麼編譯器為了確定類的虛函式表的大小,就必須要知道我們一共為該成員模板函式例項化了多少個不同版本的虛函式。顯然編譯器需要查詢所有的**檔案,才能夠知道到底有幾個虛函式,這對於多檔案的專案來說,代價是非常高的,所以規定成員模板函式不能夠為虛函式。

例如:

class func

}; int main()

那麼編譯器在編譯func類的時候,需要檢視int mian 裡面的具體呼叫,才知道會產生兩個虛函式。乙個是virtual int add (const int &a, const int &b); 另乙個是 virtual double add (const double &a, const double &b)。當專案很大,檔案特別多的時候,需要遍歷完所有的檔案才能確定實際會產生多少虛函式,所以這樣編譯的效率會非常的低。因此規定成員模板函式不能夠為虛函式

建構函式能不能是虛函式

最近有人問建構函式能不能是虛函式 當然不能 解釋一下 1,從儲存空間角度 虛函式對應乙個vtable,這大家都知道,可是這個vtable其實是儲存在物件的記憶體空間的。問題出來了,如果建構函式是虛的,就需要通過 vtable來呼叫,可是物件還沒有例項化,也就是記憶體空間還沒有,怎麼找vtable呢?...

建構函式能不能是虛函式

最近有人問建構函式能不能是虛函式 當然不能 解釋一下 1,從儲存空間角度 虛函式對應乙個vtable,這大家都知道,可是這個vtable其實是儲存在物件的記憶體空間的。問題出來了,如果建構函式是虛的,就需要通過 vtable來呼叫,可是物件還沒有例項化,也就是記憶體空間還沒有,怎麼找vtable呢?...

建構函式能不能是虛函式

最近有人問建構函式能不能是虛函式 當然不能 解釋一下 1,從儲存空間角度 虛函式對應乙個vtable,這大家都知道,可是這個vtable其實是儲存在物件的記憶體空間的。問題出來了,如果建構函式是虛的,就需要通過 vtable來呼叫,可是物件還沒有例項化,也就是記憶體空間還沒有,怎麼找vtable呢?...