夢在天涯 在上篇文章里問可不可以研究下對象與對象的類型信息怎么聯(lián)系起來的,就是當(dāng)調(diào)用dynamic_cast的時候為什么能夠正確的識別對象的類型RTTI(Run Time Type Identification)運行時類型識別是有編譯器在編譯器生成的特殊類型信息,包括對象繼承關(guān)系,對象本身的描述,RTTI是為多態(tài)而生成的信息,所以只有具有虛函數(shù)的對象在會生成那RTTI在哪里呢?MSVC編譯器在vftable前設(shè)置了一個指針,指向叫做“Complete Object Locator”(完整對象定位器)的結(jié)構(gòu)。這樣稱呼是因為它允許編譯器從特定的vftable指針(因為一個類可能有若干vftable)找到完整對象的位置。COL就像如下定義:請看如下代碼:
輸出結(jié)果:在RTTI運行時結(jié)構(gòu)體中包含許多豐富的信息,甚至我們可以利用一個實例的RTTI信息去復(fù)原整個類繼承圖譜而對于dynamic_cast也是利用這個信息來準(zhǔn)確的識別實例所對應(yīng)的類型,不過如果對于沒有多態(tài)的實例,dynamic_cast所做的也只是和編譯器類型轉(zhuǎn)換一樣的事情,僅僅是通過類型和繼承關(guān)系進行轉(zhuǎn)換,還是看例子吧:
posted on 2009-03-12 17:55 pear_li 閱讀(4247) 評論(3) 編輯 收藏 引用 所屬分類: C++