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