c++在執行運行時多態時,為什麼需要借用rtti來判斷對象真實類型?

子類在繼承父類時,如果存在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++中的引用摺疊?

TAG:編程 | CC | 編譯器 | 多態 |