程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> dynamic_cast, RTTI, 整理

dynamic_cast, RTTI, 整理

編輯:C++入門知識

主要是參考下圖,了解內存布局,然後寫個實例程序就差不多明白了,但是需要熟悉指針轉換。

1) 只有多態類才有RTTI信息,dynamic_cast正是運用RTTI進行轉換,屬於運行時類型檢查。

2) dynamic_cast判斷兩個指針是否能轉換時,用RTTI可以知道當前實際對象,然後遍歷自己所有的父類,看是否有與目標類型一致的,如果有就可以進行轉換。

3) dynamic_cast是安全的,可以通過檢查返回值或異常捕捉來判斷是否轉成功。其中檢查返回值用於指針轉換,異常捕捉用於引用轉換。

4) 補充一點,與static_cast不同,即使兩個類沒有直接繼承關系,但是只要在一個類層次結構中,就有可能指向同一個對象,也就可以進行dynamic_cast。以下圖為例,C繼承自A,B。A, B指針就可以進行dynamic_cast,並可能成功。

    C * pc = new C;
    A* pa = pc;
    B* pb = pc;

    pb = dynamic_cast<B*>(pa); // 可以成功進行轉換,因為二者指向的都是C對象。

 

 

 

 下面的例子主要是關於RTTI的,打印出一個對象和她所有父類的運行時信息,這裡的運行時信息主要是類的名字。

#include <typeinfo>
   Base :   Deri1234567890ve :  mdisp;  
     pdisp;  
     vdisp;  
 TypeDescriptor* pTypeDescriptor; 
    DWORD numContainedBases; 
     PMD ;        
    DWORD attributes;        

    DWORD attributes;     
    DWORD numBaseClasses; 
     RTTIBaseClassArray*



     TypeDescriptor* pTypeDescriptor; 
     RTTIClassHierarchyDescriptor* pClassDescriptor; 
*pderive =  *ptable = (*)*(* * rtti = ptable -    RTTICompleteObjectLocator * RIIT_locator =   (RTTICompleteObjectLocator *)( *(*<<RIIT_locator->pTypeDescriptor->name<<     * p1 = (*)(RIIT_locator->pClassDescriptor-> * p2 = (*)*(p1+* pDesc = (TypeDescriptor*)(*<<<<pDesc->name<<= (*)(RIIT_locator->pClassDescriptor->= (*)*(p1 + = (TypeDescriptor*)(*<<<<pDesc->name<<= (*)(RIIT_locator->pClassDescriptor->= (*)*= (TypeDescriptor*)(*<<<<pDesc->name<<

 

參考:

淺議 Dynamic_cast 和 RTTI   http://www.cnblogs.com/zhyg6516/archive/2011/03/07/1971898.html

http://www.openrce.org/articles/full_view/23 

 

 

asdfasdf

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved