run-time type information or run-time type identification (RTTI)
RTTI(Runtime Type Information)是C++中的一個特性,允許程序在運行時獲取類型信息。它主要用于多態(尤其是基于類的多態)時,幫助判斷對象的實際類型。
RTTI的主要功能
- 類型識別:使用 typeid 運算符,可以獲取對象的類型信息。
- 類型轉換:使用 dynamic_cast 可以安全地將基類指針或引用轉換為派生類指針或引用,從而判斷和使用派生類的功能。
RTTI的原理 RTTI的實現依賴于編譯器在編譯時生成一些額外的信息。具體來說:
- 基類信息結構:每個具有虛函數的類會有一個與之相關的“虛表”(vtable),其中包含指向虛函數的指針。同時,每個類的每個對象會有一個指向其類型信息結構的指針,通常稱為“類型信息對象”(type_info)。
- typeid 操作符:使用 typeid 時,系統會查找對象的類型信息,返回對應的 std::type_info 對象,提供類名、比較等信息。
- dynamic_cast 操作符:這是一個安全的類型轉換操作符,使用時系統會在運行時檢查類型安全。如果目標類型與對象的實際類型不匹配,dynamic_cast 將返回 nullptr(對于指針)或者拋出 std::bad_cast 異常(對于引用)。
注意事項
- 需要虛函數:為了使用RTTI,類必須至少有一個虛函數(這樣才能生成vtable和類型信息)。
- 性能開銷:RTTI會引入一定的性能開銷,尤其是在頻繁進行類型檢查和轉換的場合。
- 不支持非多態類型:RTTI僅對具有虛函數的類有效,而對于普通的非虛類,類型信息在運行時不能獲得。
參考
Run-time type information