MFC RTTI (DECLARE_DYNAMIC 及IMPLEMENT_DYNAMIC 宏)
1.1 链表元素CRuntimeClass
当达到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.2 宏
1.2.1 DECLARE_DYNAMIC
说明:
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*
*/
1.2.2 IMPLEMENT_DYNAMIC
说明:此宏实现以下行为
- 初始化当前类的CRuntimeClass类型的成员变量。 初始化方式如下:
m_lpszClassName=类名
m_nObjectSize=sizeof(类)
m_wSchema= 0xffff
m_pfnCreateObject =NULL
m_pBaseClass=指向父类的CRuntimeClass的指针
m_pNextClass=NULL - 初始化类静态成员CRuntimeClass的变量
新类的CRuntime的成员m_pNextClass= CRuntimeClass::pFirstClasse
CRuntimeClass::pFirstClass = pNewClass;
这的意思是类成员classCRuntimeClass成员的pNext指向 CRuntimeClass::pFirstClasse;然后CRuntimeClass::pFirstClasse这个指针又指向了classCRuntimeClass这个类成员对象
说明:
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