C++ 如何将多重继承转换为单一继承

C++ 如何将多重继承转换为单一继承,c++,mfc,C++,Mfc,在我的mfc源代码中,有一些类是多重继承的。比如: 类CGraphComboBox:公共CComboBox,公共虚拟CGraphBaseClass 类CGraphFrame:public CFrameWnd,public virtual CGraphBaseClass 类CGraphPanel:公共CWnd,公共虚拟CGraphBaseClass 类CGraphBaseClass类似于: class CGraphBaseClass { public: typedef int(*

在我的mfc源代码中,有一些类是多重继承的。比如:

类CGraphComboBox:公共CComboBox,公共虚拟CGraphBaseClass

类CGraphFrame:public CFrameWnd,public virtual CGraphBaseClass

类CGraphPanel:公共CWnd,公共虚拟CGraphBaseClass

类CGraphBaseClass类似于:

class CGraphBaseClass
{
    public:

    typedef int(*BaseClassWndCallbackFunc)(CGraphBaseClass* base_class, void* param);

    public:
    CGraphBaseClass(){};

    virtual CGraphWnd* get_main_graph_window();
    virtual void AppendMenuItems(CMenu* menu){};

    void EnumerateParentWindows(BaseClassWndCallbackFunc enum_func, void* user_data);
};
他们的一个基类是MFC标准类,我不能修改它(例如CComboBox),另一个基类(CGraphBaseClass)是我自己的类。 我之所以将类CGraphBaseClass设置为虚拟类,是因为在其他位置,我需要动态绑定它的函数

如下代码所示:

int AppendMenuForAllParents(CGraphBaseClass* base_class, void* param)
{
    CMenu* menu = reinterpret_cast<CMenu*>(param);
    base_class->AppendMenuItems(menu);
    return 0;
}
由于类的多重继承和虚拟基类,因此

警告C4407:在指向成员表示的不同指针之间强制转换,编译器可能会生成不正确的代码

在这些消息映射中

意义

#define ON_WM_CREATE() \
    { WM_CREATE, 0, 0, 0, AfxSig_is, \
        (AFX_PMSG) (AFX_PMSGW) \
        (static_cast< int (AFX_MSG_CALL CWnd::*)(LPCREATESTRUCT) > ( &ThisClass :: OnCreate)) },
#在_WM_CREATE()上定义\
{WM_CREATE,0,0,0,AfxSig_是\
(AFX_PMSG)(AFX_PMSGW)\
(static_cast(&ThisClass::OnCreate)),
无法生成正确的代码


我的问题是:我如何重构代码以避免这些多重继承?

你读过“组合重于继承”的书吗?我会投资于将
CGraphBaseClass
部分组合而不是继承。如果我将CGraphBaseClass组合到CGraphPane等,那么这三个类CGraphPane、CGraphFrame和CGraphComboBox将没有关系。因此,我不能使用运行时绑定来执行代码base\u class->AppendMenuItems(菜单);我想这将是一个糟糕的设计你基本上有一个接口。您可以让窗口类在内部实现接口/类,然后通过返回接口来响应消息。例如,在每个窗口类中定义一个类似消息的(WM_APP+1)。响应函数返回指向内部类的指针。。。或者,声明一个COM接口并实现接口,因为MFC窗口类支持COM。我使用过类似的设计(虽然没有虚拟继承),没有任何问题,我不记得这个编译器警告。根据这项研究,如果某些约束得到尊重,它应该会起作用。当然,这是针对VC 6.0的,因此这可能不再适用于VC的最新版本。我只能通过使用虚拟继承进行复制。你真的需要虚拟继承吗?从您的示例代码来看,您似乎没有需要解决的菱形问题。
#define ON_WM_CREATE() \
    { WM_CREATE, 0, 0, 0, AfxSig_is, \
        (AFX_PMSG) (AFX_PMSGW) \
        (static_cast< int (AFX_MSG_CALL CWnd::*)(LPCREATESTRUCT) > ( &ThisClass :: OnCreate)) },