C 的CRTP所帶來的靜態多型功能具體有什麼用?

時間 2021-05-09 21:20:53

1樓:佐羅

CRTP是c++的一種靜態多型實現,CRTP符合OOP封裝、繼承、多型的思想,把函式寫成非類成員函式當然也可以,但這就失雲了封裝、繼承的特性。

就題主的例子,常見寫法是:

template

class Animal

protected:

void doeat()

};派生類可重定義doeat實現具體化行為,也可以不重寫doeat(),這時侯呼叫基類的doeat()實現預設行為,如果不使用類成員函式,就失去了這種繼承特性。

在oop裡,多型是物件行為的抽象,而物件行為的抽象建立在物件型別抽象的基礎上。c++的動態多型需要建立在抽象的型別為具體型別,而CRTP的抽象型別(如例子的Animal類)是「泛型」。

2樓:

我用過。

當時場景是這樣的,有一段二進位制格式流要解包,就是定長頭+變長體的那種格式。在這些解包操作類的基類和子類之間,就用了這種方式。

當時主要的考慮就是省掉 vptr。這樣,就可以直接把這些類都當做 pod 型別,直接在指定偏移拿某個類的指標做型別強轉就可以直接得到乙個例項了。這樣就可以省掉建構函式和析構函式的開銷,以及這兩個函式執行過程中可能產生的記憶體拷貝。

3樓:消失的無意識

1.特化某些函式,比如實現乙個ptr具有和T一樣的複製建構函式(T不是都有複製建構函式)

2.分離功能,比如說實現乙個支援跨執行緒的侵入式指標,但是不希望在實現的時候就引入atomic等多執行緒標頭檔案定義

這東西沒法代替多型,多型的核心是型別擦除,crtp只是泛型別罷了。

另外盡量不要使用它,現在的原始碼編輯器基本不支援完整模板的例項化查詢,要是濫用的話將會導致難以維護。

4樓:

Benefits:

Static virtual function.

2. Get virtual function without the cost of v table.

C 的多型為什麼不在編譯期完成?

因為做不到啊,舉個例子,抽象類A有乙個虛函式B。現在我寫乙個函式,引數是抽象類A的指標,這個函式裡面呼叫虛函式B。那怎麼知道虛函式B是誰呢? Parent p rand 1 0?newChild1 newChild2 因為這種情況沒法在編譯期完成。 羊羊羊 c 有所謂編譯器多型,就是template...

無知所帶來的快樂和有思想所帶來的快樂有何本質區別?

liqingqi 沒有區別,因為有思想和無知只是個相對詞。日心說的哥白尼一定有他的快樂,原始崇拜的印第安人也有他的快樂。但有思想是真的有思想嗎?無知又是真的無知嗎?如果兩個人遇見,聊半天,估計會互罵SB,心裡覺得對方才是無知的人。所以快樂就行。 詰詰摩 一種只會是你的過程 等以後你會發現那不過是過去...

如何評價不知道C 三大特性是封裝 繼承 多型的程式設計師?

zzzman 可以這樣說,不知道三大特性,那沒什麼關係呀,有的程式設計師,本身就是使用c語言寫嵌入式系統的程式,但因為業主的原因,必須要使用c 於是,就將c 當成是c來使用了。這有什麼問題?只要能滿足業主的功能與效能的需求就行了,而具體的實現方式還真的不用太在意。我覺得寫程式非常重要的一點是,程式是...