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_caststatic_cast,如果不可能,则使用其他方式 reinterpret_cast