沒虛擬函式當然能過,只要有函式指標就行了。有人說那幹嘛不用C,我的解釋是C當然可以實現dynamic dispatch,只是效率和bug-free不可兼得罷了 - 簡單的方案(比如fuse那樣搞一大坨函式指標)太低效;手寫虛表雖然一樣高效,但是要破壞型別系統弄很多cast,還要算偏移量。

什麼“OOP”都是虛妄。C++虛擬函式能實現的只是簡單的dynamic dispatch,還是single dispatch,很多現實問題根本不夠用。舉例來說,你實現個bool Intersect(const Shape&, const Shape&)我看看。。還不是得到處開洞手寫double dispatch。而模板特化要解決這個問題就漂亮多了。

至於複雜的類繼承關係。。你們開心就好:)

虛擬函式比較實用的地方第一是表達unbounded discriminated union/variant/sum type,隨你們怎麼叫。。基本上是表示資料結構的,虛擬函式介面不應該承載太多邏輯,甚至可以只留一個虛析構。這時候就應該勇敢地配合dynamic_cast用,不要羞澀。。

第二個就是type erasure並以此封裝獨立的二進位制模組了。一個極端的例子是boost::any,幾乎抹得一乾二淨。shared_ptr把allocator和deleter都抹了,libstdc++就是用虛擬函式抹的。一般來說設計正常的模組邊界��

錦心似玉穎兒演的誰

�介面比較簡單,虛擬函式也能承載。

這兩點在LLVM的程式設計手冊中有提及:

LLVM Programmer’s Manual

,Designing Type Hiercharies and Polymorphic Interfaces 一節。