一、作用:动态创建对象
二、使用
1、必须直接或间接继承CObject类
2、类内添加声明宏DECLARE_DYNCREATE(CDog)
3、类外添加实现宏DECLARE_DYNCREATE(CDog, CAnimal)
三、具体实例
1 class CAnimal : public CObject 2 { 3 DECLARE_DYNCREATE(CAnimal) 4 }; 5 IMPLEMENT_DYNCREATE(CAnimal, CObject) 6 7 class CDog : public CAnimal 8 { 9 //DECLARE_DYNCREATE(CDog) 10 //DECLARE_DYNAMIC(CDog) 11 public: 12 static const AFX_DATA CRuntimeClass classCDog; 13 virtual CRuntimeClass* GetRuntimeClass() const; 14 static CObject* PASCAL CreateObject(); 15 }; 16 //IMPLEMENT_DYNCREATE(CDog, CAnimal) 17 CObject* PASCAL CDog::CreateObject() 18 { 19 return new CDog; 20 } 21 22 //IMPLEMENT_RUNTIMECLASS(CDog, CAnimal, 0xFFFF, CDog::CreateObject) 23 AFX_COMDAT const AFX_DATADEF CRuntimeClass CDog::classCDog = 24 { 25 "CDog", 26 sizeof(class CDog), 27 0xFFFF, 28 CDog::CreateObject, 29 RUNTIME_CLASS(CAnimal), 30 NULL 31 }; 32 33 CRuntimeClass* CDog::GetRuntimeClass() const 34 { 35 return RUNTIME_CLASS(CDog); 36 } 37 38 int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) 39 { 40 CObject *Obj = RUNTIME_CLASS(CDog)->CreateObject(); 41 if (Obj->IsKindOf(RUNTIME_CLASS(CDog))) 42 { 43 printf("Obj is the object of CDog\n"); 44 } 45 else 46 { 47 printf("Obj isn't the object of CDog\n"); 48 } 49 return 0; 50 }
从实例可以看出,动态创建机制和运行时类信息机制查差不多,无非就多了一个静态成员函数,用于创建对象,并返回
对象地址,还有就是运行时类信息结构体的第四个成员不再为NULL,而是保存了一个静态成员函数的地址。
四、伪代码
1 CObject *Obj = RUNTIME_CLASS(CDog)->CreateObject(); 2 { 3 pObject = (*m_pfnCreateObject)(); 4 { 5 return new CDog; 6 } 7 }