当达到RTTI的能力必须要达到一种能力就是在构建类的时候记录必要信息,以建立型录。型录中的类住处最好以链表的形式存。
链表元素将以 CRuntimeClass描述
struct CRuntimeClass
{
// Attributes
LPCSTR m_lpszClassName;
int m_nObjectSize;
UINT m_wSchema; // schema number of the loaded class
CObject* (PASCAL* m_pfnCreateObject)(); // NULL => abstract class
CRuntimeClass* m_pBaseClass;
// CRuntimeClass objects linked together in simple list
static CRuntimeClass* pFirstClass; // start of class list
CRuntimeClass* m_pNextClass; // linked list of registered classes
};
struct AFX_CLASSINIT
{
AFX_CLASSINIT(CRuntimeClass* pNewClass);
};
每一个类都有一个CRuntimeClass的成员变量。命名规则为 “class类名”。
说明:
1.声明CRuntimeClass的静态变量,变量名为 class+类名
2静态成员函数CRuntimeClass* GetRuntimeClass()const 来获取当前类CRuntimeClass静态成员的指针。
class CCmdTarget : public CObject
{
DECLARE_DYNAMIC(CCmdTarget)
/*展开的话*/
/*
public:
static CRuntimeClass classCCmdTarget; //声明一个CRuntimeClass的变量
virtual CRuntimeClass* GetRuntimeClass() const; //声明一个函数GetRuntimeClass返回一个CRuntimeClass*
*/
说明:此宏实现以下行为
说明:
CRuntimeClass::pFirstClasse这个指针始终指向最后一个类的’class类名’
最后一个类的’class类名’的next成员始终指向他父类的 ‘class类名’
IMPLEMENT_DYNAMIC(CCmdTarget, CObject)
/*
CCmdTarget.classCCmdTarget={"CCmdTGarget",sizeof(CCmdTarget),0xffff,NULL,&CObject.classCObject,NULL};
CCmdTarget.classCCmdTarget.m_pNextClass=CRuntimeClass::pFirstClass;
CRuntimeClass::pFirstClass=CCmdTarget.classCCmdTarget;
*/
参考:深入浅出MFC