差不多了,但是动态创建的区别是有一个好处,你可以通过CRuntimeClass直接创建,并检查继承关系,因为它通过虚基类。引用静态mfc类库时,动态申请源代码(AFX.h):#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)//////////////////////////////////////////////////////////上面所引用的宏 #define DECLARE_DYNAMIC(class_name) \
public: \
static const AFX_DATA CRuntimeClass class##class_name; \
virtual CRuntimeClass* GetRuntimeClass() const; \#define IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, pfnNew) \
AFX_COMDAT const AFX_DATADEF CRuntimeClass class_name::class##class_name = { \
#class_name, sizeof(class class_name), wSchema, pfnNew, \
RUNTIME_CLASS(base_class_name), NULL }; \
CRuntimeClass* class_name::GetRuntimeClass() const \
{ return RUNTIME_CLASS(class_name); } \

解决方案 »

  1.   

    这里所谓的动态的创建,就是用一个函数CreateObject来创建,实际上这个函数调用new。用动态创建的好处:
    1 在MFC的框架中,Doc,View,Frame之间是由某些关联的,在new出这些东西之后,要建立这些对象之间的关联,而MFC已经把这些关联做好了,它又不知道你定义的具体的子类,因此需要调用CreateObject来创建。
    2 在序列化Serialize的时候,当需要读一个类的时候,也需要创建它,而同样的需要调用CreateObject来创建。
      

  2.   

    用NEW 是在你已经知道要用那个类,很明确,
    而动态创建是有很多不确定因素的,要根据运行时类别来确定到底需要创建的是一系列继承中的那一个,好在这些东西MFC都帮你给做了,只是在开发时需要加上一些宏。