动态创建的那部分struct CRuntimeClass
{
LPCSTR m_lpszClassName;
int m_nObjectSize;
UINT m_wSchema;
CObject* (PASCAL* m_pfnCreateObject)();
CRuntimeClass* m_pBaseClass;
______________________________________
CObject* CreateObject();
static CRuntimeClass* PASCAL Load();
______________________________________
static CRuntimeClass* pFirstClass;
CRuntimeClass* m_pNextClass;
}在IMPLEMENT_DYNCREATE宏中,有代码
CObject* PASCAL class_name::CreateObject()
{
return new class_name;
}
已经实现创建对象的功能了吧??并且CRuntimeClass* m_pBaseClass在这个宏里也被赋值指向这个函数了但是后面又有
CObject* CRuntimeClass::CreateObject()
{
if(m_pfnCreateObject == NULL)
{
TRACE1(.....);
return NULL;
}
CObject* pObject = NULL;
pObject = (*m_pfnCreateObjcet)();
}这两个CreateObject怎么理解??
{
LPCSTR m_lpszClassName;
int m_nObjectSize;
UINT m_wSchema;
CObject* (PASCAL* m_pfnCreateObject)();
CRuntimeClass* m_pBaseClass;
______________________________________
CObject* CreateObject();
static CRuntimeClass* PASCAL Load();
______________________________________
static CRuntimeClass* pFirstClass;
CRuntimeClass* m_pNextClass;
}在IMPLEMENT_DYNCREATE宏中,有代码
CObject* PASCAL class_name::CreateObject()
{
return new class_name;
}
已经实现创建对象的功能了吧??并且CRuntimeClass* m_pBaseClass在这个宏里也被赋值指向这个函数了但是后面又有
CObject* CRuntimeClass::CreateObject()
{
if(m_pfnCreateObject == NULL)
{
TRACE1(.....);
return NULL;
}
CObject* pObject = NULL;
pObject = (*m_pfnCreateObjcet)();
}这两个CreateObject怎么理解??
1、CAbc abc;
2、CAbc* pabc = new CAbc;
3、CAbc* pabc = (CAbc*)CAbc::CreateObject();
这样创建的前提是编译器已经知道所有这些自定义类的定义了。问题在于MFC框架并不识别这些类,它认识的类只有最基本的CObject/CWnd之类的,如果需要框架来自动创建自定义类,上述方式全都用不了,因为框架根本不认识CAbc是什么,这就要求一种运行时类型信息(RTTI)识别的机制,CRuntimeClass就是MFC实现的一种RTTI。其原理就是每个从CObject派生的类都要求提供一个名称和创建自身的回调函数,而每个类都把这些信息作为CRuntimeClass链表中的一个节点的属性,当框架需要动态创建自定义类时,它从运行时类链表中根据类名称查找CRuntimeClass节点,一旦找到就调用CRuntimeClass::CreateObject方法,这个方法再调用登记的回调函数完成实际的对象创建。深入浅出MFC其实已经介绍得非常透彻了。
你注意函数的实现内容,其实关键的就在于CRuntimeClass::CreateObject这个函数调用的是一个函数指针m_pfnCreateObjcet,而这个m_pfnCreateObjcet真正指向的函数就去上面的那个class_name::CreateObject()。因此动态创建最终调用的只有宏里面实现的new class_name;