模仿RTTI关键步骤:

1.数据结构:

 
  
  1. struct CRuntimeClass {  
  2.     char ×strName;  
  3.     int classSize;  
  4.     static CRuntimeClass *pFirstClass;  
  5.     CRuntimeClass *pBaseClass;  
  6.     CRuntimeClass *pNextClass;  

2.组织形式:以链表的形式组织,在不同的类中以静态成员的形式存在

 
  
  1. #define DYNAMIC_CAST(class_name) \  
  2. public:      
  3.     static CRuntimeClass class##class_name;  
  4.     virtual CRuntimeClass *getClass() const;    
  5.     
  6. struct AFX_CLASS_INIT { 
  7. AFX_CLASS_INIT(CRuntimeClass *pnewClass);
  8. };
  9. AFX_CLASS_INIT::AFX_CLASS_INIT(CRuntimeClass *pnewClass) {
  10. pnewClass->pNextClass = CRuntimeClass::pFirstClass;
  11. CRuntimeClass::pFirstClass = pnewClass;
  12. }
  1. #define RUNTIMECLASS(class_name) (&class_name::class##class_name)  
  2.  
  3. #define IMPLEMENT_DYNAMIC(class_name,base_class_name) \  
  4.     static char str##class_name[] = #class_name; \  
  5.     CRuntimeClass class##class_name = {str##class_name, \  
  6.     sizeof(class_name), RUNTIMECLASS(base_class_name) ,NULL)
  7. static AFX_CLASS_INIT init_##class_name(&class_name::class##class_name);
  8. CRuntimeClass *class_name::getClass() const {
  9. return &class_name::class##class_name;
  10. }
  11.  

 3.举例说明:

 

 
  
  1. class CParent :public CObject {  
  2.     DYNAMIC_CAST(CPARENT)  
  3.     ...  
  4. }  
  5.  
  6. class CChild:public CParent {  
  7.     DYNAMIC_CAST(CChild)  
  8.     ...  
  9. }  
  10. IMPLEMENT_DYNAMIC(CParent, CObject)  
  11. IMPLEMENT_DYNAMIC(CChild,CParent)