RTTI(Run-Time Type Identification,執行階段型別識別) 是 C++ 語言機制,允許程式在「執行時期」而非「編譯時期」識別物件的實際型別。主要包含兩個運算子:
dynamic_cast:安全地執行向下轉型(Downcasting)typeid:取得物件的型別資訊C++ 屬於靜態型別語言,編譯時期就決定型別。但在多型情境下,基底類別指標可能指向衍生類別物件,編譯器無法在編譯期確知實際型別。RTTI 正是為了解決此問題,提供執行時期的型別檢查能力。
MFC(Microsoft Foundation Classes)在 C++ 標準化之前就已開發,當時 C++ 尚無內建 RTTI。為實現動態建立、序列化、訊息對應等功能,MFC 透過巨集與樣板程式碼「手工模擬」了類似 RTTI 的機制:
| 標準 C++ RTTI | MFC 實作方式 | 用途 |
|---|---|---|
dynamic_cast | DYNAMIC_DOWNCAST 巨集 | 安全向下轉型 |
typeid | CRuntimeClass 結構 + RUNTIME_CLASS 巨集 | 型別資訊查詢 |
| 無對應 | DECLARE_DYNCREATE / IMPLEMENT_DYNCREATE | 動態建立物件 |
| 無對應 | DECLARE_SERIAL / IMPLEMENT_SERIAL | 序列化支援 |
主程式編譯完成後,第三方開發外掛(DLL)。主程式無法在原始碼中直接參考外掛類別,必須透過執行時期型別識別:
CreatePlugin())Java、C# 等現代語言內建反射,編譯器將型別中繼資料直接嵌入組件。C++ 為追求效率與零開銷抽象,語法層面不支援完整反射,故 MFC 以巨集技巧彌補語言缺陷。這類「彌補語言缺陷」的 MFC 技巧還包括:
BEGIN_MESSAGE_MAP)TRY/CATCH)dynamic_cast、typeid、std::type_info)CRuntimeClass 的章節RUNTIME_CLASS、DYNAMIC_DOWNCAST 定義RTTI 是 C++ 多型編程的關鍵基礎設施。MFC 早於標準化時代,以巨集模擬 RTTI 並延伸出動態建立、序列化等強大功能。理解兩者關係,不僅能深入掌握 MFC 內部運作,更能洞見 C++ 語言演進歷程與設計哲學。