c++在執行運行時多態時,為什麼需要借用rtti來判斷對象真實類型?
01-26
子類在繼承父類時,如果存在override,則會修改虛表中繼承而來的虛函數的地址,使其指向該對象自己定義的函數。而該函數的slot在虛表中的索引不會改變,虛表指針又都在object首,直接使用vt[index]不就行了,為什麼還要使用RTTI來判斷對象類型?我的意思是,無論是base還是derived,最終調用的都是vptr指向的vt的一個固定slot。
如果上述過程不正確,那麼到底在什麼情況下會使用RTTI?
非常感謝!
運行時多態又不僅僅是虛函數……
dynamic_cast也是運行時多態
typeid也是運行時多態
throw和catch異常也是運行時多態
只有第一個不需要運行時類型信息
多看《深度探索C++對象模型》,不要瞎猜什麼虛表指針又都在object首這種事情。你要知道C++可是有多重繼承+虛擬繼承的,虛表結構沒這麼簡單的。
不過調用虛函數的時候,的確不需要知道那是什麼類型。但是做dynamic_cast的時候需要。
dynamic_cast 的時候需要到整個繼承樹里去查找要 cast 的類型。
A1繼承A;A2 也繼承 A;A3 虛繼承A1和A2。你打算咋辦?這能給你玩出花來
跟RTTI沒半毛錢關係~
題主可以看看彙編(msvc),mov ecx,this;this給ecx
mov eax,[ecx];虛表指針給eax
...... push參數call [eax+offset];所以你看,你描述的這個過程根本就沒用到類型信息,即使你關閉了編譯器的RTTI選項,你依然可以調用虛函數推薦閱讀:
※一個關於C++模板的問題?
※關於c++模板推導失敗,這是編譯器的bug嗎?
※《深度探索c++對象模型》,C語言有沒有類似的書,講解C語言低層細節及編譯器所做工作?
※計算機語言是有局限性的么?
※如何理解c++中的引用摺疊?