前面做了一基於對話框的基類,詳情見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宏出現問題。
查看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對象了。