我最近正在爲一個副項目(cpp-markdown
library,好奇)編寫一段C++代碼,並遇到了一個編碼問題,我希望得到一些意見。避免dynamic_cast/RTTI
cpp-markdown
有一個名爲Token
的基類,它有許多子類。其中兩個主要子類是Container
(其中包含其他Token
的集合)和TextHolder
(當然,用作Token
的基類)。
大部分的處理都是通過虛擬函數來處理的,但是其中一些處理在單個函數中處理得更好。爲此,我最終使用dynamic_cast
將指針從Token*
下載到它的一個子類,所以我可以調用特定於子類及其子類的函數。鑄造失敗是不可能的,因爲代碼能夠通過虛函數(例如isUnmatchedOpenMarker
)知道何時需要這樣的事情。
還有其他兩種方式我看得出來處理這個問題:
創建的,我想作爲
Token
虛函數調用函數的所有,只是讓他們有一個空的機構除了需要處理他們一個(或多個),或......每個子類中創建
Token
一個虛函數,將在適當類型的指針回到this
當它呼籲某些亞型,和一個空指針如果被調用在其他方面。基本上是我已經在那裏使用的虛擬功能系統的擴展。
第二種方法似乎比雙方現有的一個,第一個更好的,對我來說。但我想知道其他有經驗的C++開發人員對此的看法。或者我是否過於擔心瑣事。 :-)
同意,如果您已經使用虛函數檢查類型,那麼dynamic_cast就沒用了。您的其他解決方案都只是白色洗滌,您的層次結構被打破。如果你有一個黑客,至少使用更快的黑客。 – BigSandwich 2009-02-24 03:56:28
如果派生類使用虛擬繼承從Token繼承,則static_cast將不起作用。在這種情況下,dynamic_cast不會沒用。 – bk1e 2009-02-24 06:18:29