模仿RTTI關鍵步驟:
1.數據結構:
- struct CRuntimeClass {
- char ×strName;
- int classSize;
- static CRuntimeClass *pFirstClass;
- CRuntimeClass *pBaseClass;
- CRuntimeClass *pNextClass;
- }
2.組織形式:以鏈表的形式組織,在不同的類中以靜態成員的形式存在
- #define DYNAMIC_CAST(class_name) \
- public:
- static CRuntimeClass class##class_name;
- virtual CRuntimeClass *getClass() const;
- struct AFX_CLASS_INIT {
- AFX_CLASS_INIT(CRuntimeClass *pnewClass);
- };
- AFX_CLASS_INIT::AFX_CLASS_INIT(CRuntimeClass *pnewClass) {
- pnewClass->pNextClass = CRuntimeClass::pFirstClass;
- CRuntimeClass::pFirstClass = pnewClass;
- }
- #define RUNTIMECLASS(class_name) (&class_name::class##class_name)
- #define IMPLEMENT_DYNAMIC(class_name,base_class_name) \
- static char str##class_name[] = #class_name; \
- CRuntimeClass class##class_name = {str##class_name, \
- sizeof(class_name), RUNTIMECLASS(base_class_name) ,NULL)
- static AFX_CLASS_INIT init_##class_name(&class_name::class##class_name);
- CRuntimeClass *class_name::getClass() const {
- return &class_name::class##class_name;
- }
3.舉例說明:
- class CParent :public CObject {
- DYNAMIC_CAST(CPARENT)
- ...
- }
- class CChild:public CParent {
- DYNAMIC_CAST(CChild)
- ...
- }
- IMPLEMENT_DYNAMIC(CParent, CObject)
- IMPLEMENT_DYNAMIC(CChild,CParent)