1.新的CRuntimeClass结构
在程序执行期间,根据动态获得的一个类名称,比如动态获得一个类名称,要求程序产生一个对象。
把类的大小记录在类别型录中,把建构函数CRuntimeClass::CreateObject记录在类别型录中,当程序在执行期间获得一个类名称,就可以在类别型录网中找出对应的元素,然后调用其构建函数,产生对象。
重新定义CRuntimeClass
struct CRuntimeClass
{
//Attributes
LPCSTR m_lpszClassName; //类名,一般是指包含CRuntimeClass对象的类的名称
int m_nObjectSize; //包含CRuntimeClass对象的类sizeof的大小,不包括它分配的内存
UINT m_wSchema; // schema number of the loaded class分类编号(对不可分类的类,该值为-1)
CObject* (PASCAL * m_pfnCreateObject)();// NULL => abstract class 指向一个建立实例的构造函数,创建一个类的对象,抽象类则返回NULL(只有在类支持动态创建时才有效;否则,返回NULL)。
//PASCAL不用管,是个过时了的calling convension。 CObject*(* m_pfnCreateObject)(); 指向函数的指针 如:int (*fn)();
//这是mfc用于动态对象创建的CRuntimeClass结构的一个成员变量
CRuntimeClass* m_pBaseClass;//基类对象指针
CObject* CreateObject();
static CRuntimeClass* PASCAL Load();
static CRuntimeClass* pFirstClass;//链表指针
CRuntimeClass* m_pNextClass;//链表指针
};
2.DECLARE_DYNCREATE和/IMPLEMENT_DYNCREATE宏
#define DECLARE_DYNCREATE(class_name)
DECLARE_DYNAMIC(class_name)
static CObject* PASCAL CreateObject();
#define IMPLEMENT_DYNCREATE(class_name,base_class_name)
CObject* PASCAL class_name::CreateObject()
{return new class_name;}
_IMPLEMENT_RUNTIMECLASS(class_name,base_class_name,0xFFFF,\class_name::CreateObject)