前面做了一基于对话框的基类,详情见https://blog.csdn.net/yishang44/article/details/99680673。在做基于CFormView的基类时候进行了相似的操作。
//.h文件
class CBaseForm : public CFormView
{
DECLARE_DYNCREATE(CBaseForm)
protected:
//CBaseForm(); // protected constructor used by dynamic creation
CBaseForm(LPCTSTR lpszTemplateName);
CBaseForm(UINT nIDTemplate);
//
………………………………
/
};
//.cpp文件
IMPLEMENT_DYNCREATE(CBaseForm, CFormView)
CBaseForm::CBaseForm(LPCTSTR lpszTemplateName)
:CFormView(lpszTemplateName)
{
}
CBaseForm::CBaseForm(UINT nIDTemplate)
:CFormView(nIDTemplate)
{
}
……………………………………
本以为就结束了,没想到出了问题。问题如下图,IMPLEMENT_DYNCREATE宏出现问题。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL90TQOBzYtJGaoJzYwx2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLzMTO0IDO1IjM1IDMxkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
查看MFC中的源码,IMPLEMENT_DYNCREATE宏的实现细节
#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, NULL)
#define IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, pfnNew, class_init) \
CRuntimeClass* PASCAL class_name::_GetBaseClass() \
{ return RUNTIME_CLASS(base_class_name); } \
AFX_COMDAT const CRuntimeClass class_name::class##class_name = { \
#class_name, sizeof(class class_name), wSchema, pfnNew, \
&class_name::_GetBaseClass, NULL, class_init }; \
CRuntimeClass* PASCAL class_name::GetThisClass() \
{ return _RUNTIME_CLASS(class_name); } \
CRuntimeClass* class_name::GetRuntimeClass() const \
{ return _RUNTIME_CLASS(class_name); }
这里可以看到这里会动态创建一个CBaseForm对象。作为基类,是不应该存在具体对象的。这里需要修改宏为IMPLEMENT_DYNAMIC,与之对应的宏DECLARE_DYNAMIC。
#define IMPLEMENT_DYNAMIC(class_name, base_class_name) \
IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, NULL, NULL)
这里就没有动态创建CBaseForm对象了。