C 中模板與多型的區別

2021-10-08 07:12:29 字數 1141 閱讀 4947

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

比如有三種型別的形狀類,比如矩形類,柱狀體類,橢圓類,每個類都有相同的地方,都是繪製,設定旋轉,設定顏色等操作。也有不同之處,但是類內的函式名稱都一樣。呼叫時,我們是使用模板類呢,還是用多型?

如果用多型,先將形狀類中相同的屬性歸為基類,再繼承出三種派生類,基類函式定為虛函式,採用多型實現派生類每個同名函式不同作用。這樣別人調介面時,只需要例項化好三種型別中的任意乙個,直接作為引數傳入我寫好的介面中(傳入之前最好用static_cast強轉一下,為了安全起見)。

如果用模板類,使用全特化,分別定義每個形狀的操作。

rectangle

class rectangle

;

elipse

class elipse

;

myshape

template class myshape

;template<>//全特化,由於是全特化,引數都指定了,引數列表故為空。

class myshape;

template<>//全特化,由於是全特化,引數都指定了,引數列表故為空。

class myshape;

int main()

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

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

從本質上講,多型性與派生類無關。多型性只是意味著在不了解型別的情況下使用型別的能力。多型性不是使用具體的型別,而是依靠某種形式的原型來定義所採用的型別。

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

用函式來舉例:

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

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

物件導向程式設計關注的是程式設計的資料方面,而泛型程式設計關注的是演算法。所以,回到這個問題本身,我們應該用抽象類,虛函式,而不是用泛型,模板類來實現。

C 中模板與多型的思考

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

C 過載與多型的區別

過載 有兩個或多個函式名相同的函式,但是函式的形參列表不同。在呼叫相同函式名的函式時,根據形參列表確定到底該呼叫哪乙個函式。多型 在基類中定義了乙個虛函式,然後在派生類中又定義乙個同名,同參數列的函式,這就是多型。多型是這3種情況中唯一採用動態繫結技術的一種情況。也就是說,通過乙個基類指標來操作物件...

(C 模板程式設計) 多型在模板中的應用

多型 人類 class human virtual human 作為父類時一般應該有乙個虛析構函式,在 c 設計模式 中給大家講解 男人 class men public human 女人 class women public human men objmen women objwomen 父類引用...