C 中模板與多型的思考

2021-09-05 01:20:23 字數 770 閱讀 4941

開發中遇到個問題,問題如下:

有7中型別的資訊,每個型別有相同的地方,也有不用之處,但是類內函式都一樣。

最開始考慮用模板實現,因為類內函式一樣,於是寫完,編譯,報錯,查問題。

發現模板函式不能在cpp檔案中實現,要將實現與定義都放在.h檔案中。為什麼?

這是因為

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

後面提交專案後,自己在家改版:

將7中資訊相同的屬性歸為基類,再繼承出7種派生類,基類函式定為虛函式,採用多型實現派生類每個同名函式不同作用。

這樣別人調介面時,只需要例項化好7種型別中的任意乙個,直接作為引數傳入我寫好的介面中(傳入之前最好用static_cast強轉一下,為了安全起見)。

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

表面上看:模板與多型本身就是兩個東西。模板例項化是發生在編譯期(compile-time)的,而多型中的函式呼叫決議是發生在執行時(run-time)。

實際上:模板是靜多型,模板是在編譯時確定的,而平時我們說的多型是動多型,是在執行時確定。也就是多型分為兩種:靜多型和動多型。

其實可以很簡便的理解為:模板是「多對一」,多型是「一對多」。

用函式來舉例:

「多對一」:無論引數是什麼型別,這個函式都使用

「一對多」:每個型別的例項都需要自己去實現虛函式,藉由虛函式列表,多型會自動找到對應的同名函式並呼叫。

C 中模板與多型的區別

開發中遇到個問題,問題如下 比如有三種型別的形狀類,比如矩形類,柱狀體類,橢圓類,每個類都有相同的地方,都是繪製,設定旋轉,設定顏色等操作。也有不同之處,但是類內的函式名稱都一樣。呼叫時,我們是使用模板類呢,還是用多型?如果用多型,先將形狀類中相同的屬性歸為基類,再繼承出三種派生類,基類函式定為虛函...

關於C 繼承與多型的思考

在網上看到了一句話 繼承是子類使用父類的方法,而多型則是父類使用子類的方法。我覺得這句話說的還是蠻不錯的 c 中的繼承符合下列規則 1 繼承是可傳遞的。如果c從b中派生,b又從a中派生,那麼c不僅繼承了b中宣告的成員,同樣也繼承了a中的成員。object 類作為所有類的基類。2 派生類 子類 應當是...

關於C 多型的思考

c 中,可以如下定義 base father new derived father 是基類引用,指向子類物件,這一點有點類似c 該引用的使用模式如下 先說結論 測試 如下 using logging class base public virtual void show2 public void m...