C 虛函式不能使用模板類有什麼替代方案

時間 2021-06-05 12:19:04

1樓:XZiar

說白了就是擦除了型別資訊,又想在執行時恢復出來。

C++的問題在於,對於模板,每個例項都是不同的函式,且互相沒有聯絡。所以就需要在編譯期確定這個函式模板的例項。

到目前為止目標應該就應該很清晰了,每乙個具體的son呼叫哪個foo<>,都需要一一對應。形成一一對應的方法很多,大致就是:

1.if+else,你所說的。

2.虛函式,畢竟每個具體的son都是知道自己的型別的。

3.額外的繫結,執行時註冊。

各自的優劣:

1.對son沒有要求,由AAA等實現。不過每增加一種son都需要手動多加規則。

2.對AAA等沒有要求,但對son有要求,每個son自行處理呼叫關係,比較oop。但鑑於你還有BBB/CCC的區別,我覺得這不是你想要的。

3.可以說對son也沒要求,相當於1的執行時版,可以支援動態擴充。缺點是依舊每增加一種son或者一種AAA都要多一次註冊。

這種註冊一般用巨集完成……問題在於怎麼恰當地區分son,需要自己選定一種GUID。

其實三種方法本質上是一樣的。

2用的是語言自帶的虛函式機制,1則是自己實現了一次虛函式,3則是把虛函式的功能,也就是部分虛表提到外面來了……

c 靜態成員函式為什麼不能為虛函式?

Elvis Wang 其實我覺得這個問題沒有回答的必要,屬於語言概念層面的東西。class A 首先你要搞清楚什麼是普通成員函式。成員函式是類例項相關的,不同的例項物件呼叫成員函式結果一般都不同。比如,上面的fun1是成員函式,你進行呼叫 A a1 new A A a2 new A a1 fun1 ...

為什麼 C 中使用虛函式時會影響效率?

C 中使用虛函式不會影響效率。你遇到的場景,都沒到需要考慮流水線 friendly 的程度,先把東西寫出來,別想沒用的。 maple 因為查詢虛函式表的時候會有效率損失,可以通過模板的CRTP技術實現靜態繫結,詳見 C CRTP Curiously Recurring Template Patter...

為什麼c 沒有使用函式模板過載qsort等函式,是因為沒有必要嗎?

暮無井見鈴 C 有 sort 其實標準紙面上 qsort 有過載,不過不是函式模板,而實現上 給 qsort 新增過載看起來沒有什麼方便的。C 增加 C 標準庫函式的過載主要就幾個模式 部分 str wcs mem 系列函式增加過載,為了 const 正確性 大多數數學函式為各種算術型別提供過載,而...