动态创建的那部分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怎么理解??

解决方案 »

  1.   

    http://www.chinaitpower.com/A/2005-01-24/105914.html
      

  2.   

    每个从CObject派生的类都有一个静态CreateObject函数,用于创建类实例,然后把这个静态函数当作一个回调函数存储在CRuntimeClass的m_pfnCreateObject成员中,CRuntimeClass的CreateObject会调用这个回调函数来创建真实的对象。至于为什么需要两个CreateObject,因为它们的目的虽然一样,但是用途不同。每个应用程序都会从CObject派生出若干个自定义类,如果是自己创建自定义类,完全可以通过下列方式来进行:
    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其实已经介绍得非常透彻了。
      

  3.   


    你注意函数的实现内容,其实关键的就在于CRuntimeClass::CreateObject这个函数调用的是一个函数指针m_pfnCreateObjcet,而这个m_pfnCreateObjcet真正指向的函数就去上面的那个class_name::CreateObject()。因此动态创建最终调用的只有宏里面实现的new class_name;