模板類 虛函式

2021-09-26 02:48:51 字數 1260 閱讀 5062

1

class

faux27

};8910 template 11

class

vrai

1216 };

為什麼 faux 中不行呢?

因為如果 virtual function 是 template 的, 根據使用的不同型別, class faux 會有很多 do : do,do.....

而 c++ 要求在 faux 記憶體布局一定要在 faux 被例項前就確定(不確定怎麼分配記憶體啊?); 

但是如果 virtual function 是 template, 以後的使用中可能會有不確定數量的 do<>, 也就是說虛函式表確定不下來, 也就是說 faux 的記憶體布局確定不下來。

比如 faux 的乙個例項:

faux * ff = new faux().

ff->do("

hi");  //

do, 啊? 虛函式表增加了一項 virtual void do

..................

ff->do(9527);   //

do, 啊? 虛函式表又增加了一項 virtual void do

//!! 等等, 不是說 ff 例項化的時候記憶體布局(包括虛函式表)都要確定下來了嗎?呼叫乙個函式新增乙個虛函式, 這就違反規則嗎。

//為什麼虛函式表一定要確定下來呢?動態新增不是很cool? c++編譯器提前 parse 一遍不就好了?

//因為編譯器在編譯每個 cpp 的時候不管其他 cpp 的,只關心自己的編譯單元。不同編譯單元之間的引用那是 linker 的事。

//如果 a.cpp b.cpp 同時包含了 class faux ;

//那麼編譯器編譯 a.cpp 的時候增加了幾個虛函式表項; 編譯器編譯 b.cpp 的時候也增加了幾個虛函式表項, 那麼就會衝突。

//即便不衝突, 先編譯a.cpp 增加了 1,2 項, 接著編譯b.cpp 增加 3,4 項, 那麼a.obj 看來 faux 的虛函式表只有兩項, 而 b.obj 看來 faux 的虛函式表有 4 項。

//這個是不一致的。

所以為了避免這些問題, 就要求物件例項化之前虛函式表大小是確定的。

為什麼 vrai 就可以呢?

由於 vrai 是 template class,他的例項化要等到具體使用時才確定。但是無論哪個例項

vrai還是 vrai他們的虛函式表總是確定的只有乙個 virtual do。

模板類可以使用虛函式,模板函式不能是虛函式

1 普通的類中怎麼使用虛函式,模板類中也可以這麼使用虛函式 不過需要注意的是使用模板類定義不同的型別則是兩個完全不同的類。2 模板函式不能是虛函式 編譯器期望在處理類定義的時候就能確定虛函式表的大小,如果允許有類的虛成員模板函式,那麼就必須要求編譯器提前知道程式中國有對該類的該虛成員模板函式的呼叫,...

模板 虛函式

按我的閱讀和設計經驗,乙個體繫結構如果要用模板,那麼這個體系裡應該全都是模板,如果實在要公開某些虛基類,一般在模板繼承鏈中最底層 最後派生層 實現基類函式 除非有特殊需求 但前提是這個虛基類的成員引數不能是模板。在模板世界裡,虛函式除了增加虛表大小和降低執行效能,沒有實際意義。stl atl wtl...

模板vs虛函式

考慮如下兩個容器的定義 template class math container const t operator size t i const bool operator const math container a const template class music container co...