1. 程式人生 > >C++中模板與多型的思考

C++中模板與多型的思考

開發中遇到個問題,問題如下:
有7中型別的資訊,每個型別有相同的地方,也有不用之處,但是類內函式都一樣。
最開始考慮用模板實現,因為類內函式一樣,於是寫完,編譯,報錯,查問題。
發現模板函式不能在cpp檔案中實現,要將實現與定義都放在.h檔案中。為什麼?
這是因為

模板例項化是發生在編譯期(Compile-time)的

後面提交專案後,自己在家改版:
將7中資訊相同的屬性歸為基類,再繼承出7種派生類,基類函式定為虛擬函式,採用多型實現派生類每個同名函式不同作用。
這樣別人調介面時,只需要例項化好7種類型中的任意一個,直接作為引數傳入我寫好的介面中(傳入之前最好用static_cast強轉一下,為了安全起見)。

於是這裡產生的疑問有:模板和多型的區別?什麼情況下用多型比較好、什麼情況下用模板比較好呢?

表面上看:模板與多型本身就是兩個東西。模板例項化是發生在編譯期(Compile-time)的,而多型中的函式呼叫決議是發生在執行時(Run-time)。
實際上:模板是靜多型,模板是在編譯時確定的,而平時我們說的多型是動多型,是在執行時確定。也就是多型分為兩種:靜多型和動多型。

其實可以很簡便的理解為:模板是“多對一”,多型是“一對多”。
用函式來舉例:
“多對一”:無論引數是什麼型別,這個函式都使用
“一對多”:每個型別的例項都需要自己去實現虛擬函式,藉由虛擬函式列表,多型會自動找到對應的同名函式並呼叫。