MFC动态创建+多重继承+使用baseclass指针?
MFC Dynamic Creation + Multiple Inheritance + Using base class pointer?
我试图向各种 CView 项目添加一个公共基础 class 以简化事情,但得到了奇怪的结果。下面的示例:
Header:
#pragma once
class CParams;
class CCommonBase
{
public:
//virtual ~CCommonBase() {};
virtual void DrawMyView(const CParams *params)=0;
};
class CMyView : public CEditView, CCommonBase
{
DECLARE_DYNCREATE(CMyView)
protected:
CMyView(); // protected constructor used by dynamic creation
virtual ~CMyView();
public:
virtual void DrawMyView(const CParams *params);
};
代码:
IMPLEMENT_DYNCREATE(CMyView, CEditView)
CMyView::CMyView()
{
}
CMyView::~CMyView()
{
}
void CMyView::DrawMyView(const CParams *params) {
// ... do whatever ...
}
CTabView 中的示例用法:
// have each view draw itself
CMFCTabCtrl &tabctrl=GetTabControl();
for(int i = 0;i < tabctrl.GetTabsNum();++i)
{
CCommonBase *view=(CCommonBase*) tabctrl.GetTabWnd(i);
if (view) {
// This call ends up doing nothing but calling IMPLEMENT_DYNCREATE(CMyView, CEditView)
view->DrawMyView(params);
// Note: When virtual ~CCommonBase() {}; is not commented out the call above
// ends up calling the destructor which cases an MFC assert failure
}
}
上面代码中的注释解释了会发生什么。我可以投射到 CMyView class 并且它有效。
有没有办法将一个简单的基础 class 添加到从 MFC classes 派生的 classes 并使用基础 class 来调用函数?
TIA!!
只要你用硬C cast,你就没有机会。使用 dynamic_cast
您强制将 GetTabWnd
返回的 CWnd
指针用作 CCommonBase
,但事实并非如此。这是一个 CMyView
.
通过使用 dynamic_cast 检查内部推导和虚表。要求是所有 类 都有一个虚拟成员。`
我的建议:永远不要使用旧的转换语法。使用 dynamic_cast
、static_cast
,如果不可能,则使用其他方式 reinterpret_cast
我试图向各种 CView 项目添加一个公共基础 class 以简化事情,但得到了奇怪的结果。下面的示例:
Header:
#pragma once
class CParams;
class CCommonBase
{
public:
//virtual ~CCommonBase() {};
virtual void DrawMyView(const CParams *params)=0;
};
class CMyView : public CEditView, CCommonBase
{
DECLARE_DYNCREATE(CMyView)
protected:
CMyView(); // protected constructor used by dynamic creation
virtual ~CMyView();
public:
virtual void DrawMyView(const CParams *params);
};
代码:
IMPLEMENT_DYNCREATE(CMyView, CEditView)
CMyView::CMyView()
{
}
CMyView::~CMyView()
{
}
void CMyView::DrawMyView(const CParams *params) {
// ... do whatever ...
}
CTabView 中的示例用法:
// have each view draw itself
CMFCTabCtrl &tabctrl=GetTabControl();
for(int i = 0;i < tabctrl.GetTabsNum();++i)
{
CCommonBase *view=(CCommonBase*) tabctrl.GetTabWnd(i);
if (view) {
// This call ends up doing nothing but calling IMPLEMENT_DYNCREATE(CMyView, CEditView)
view->DrawMyView(params);
// Note: When virtual ~CCommonBase() {}; is not commented out the call above
// ends up calling the destructor which cases an MFC assert failure
}
}
上面代码中的注释解释了会发生什么。我可以投射到 CMyView class 并且它有效。
有没有办法将一个简单的基础 class 添加到从 MFC classes 派生的 classes 并使用基础 class 来调用函数?
TIA!!
只要你用硬C cast,你就没有机会。使用 dynamic_cast
您强制将 GetTabWnd
返回的 CWnd
指针用作 CCommonBase
,但事实并非如此。这是一个 CMyView
.
通过使用 dynamic_cast 检查内部推导和虚表。要求是所有 类 都有一个虚拟成员。`
我的建议:永远不要使用旧的转换语法。使用 dynamic_cast
、static_cast
,如果不可能,则使用其他方式 reinterpret_cast