我似乎找到了一个我应该遭受“可怕的”钻石继承问题的案例。但是,代码似乎工作得很好。我似乎无法确定的是是否存在问题。
这是设置。我正在使用 MFC 并扩展了 CEdit 以添加对鼠标单击窗口消息的自定义处理。然后我继承了这个类和一个第三方开发者编写的类(在这个例子中叫他 Bob)。这样做,我现在可以返回我的特殊控件或 Bob 控件的增强版本。问题是,Bob 的库无法修改,我们的代码最终都继承自 CEdit(以及 CWnd)。
示例代码:
class A : public CEdit {...} // From Bob's library
class B : public A {...} // From Bob's library
class BobsEdit : public B {...} // From Bob's library
// My version which handles WM_LBUTTONDOWN, WM_CREATE
// and does a couple other cool things.
class MyEdit : public CEdit
{
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if ( !CEdit::Create(...) ) return -1;
...set some style stuff...
}
afx_msg void OnLButtonDown(UINT nFlags,CPoint point) {} // Override CWnd handler
}
class MyBobsEdit : public BobsEdit, public MyEdit {} // My version of Bob's control
// CBobsUser returns just a standard CEdit and BobsEdit control
// This is also from Bob's library.
class CBobsUser
{
CWnd* GetMeAnEditBox()
{
CEdit* pEdit;
if ( ...some condition... )
pEdit = new CEdit();
else
pEdit = new BobsEdit();
...
return pEdit;
}
}
// CMyUser overrides Bob's GetMeAnEditBox and returns
// one of my custom controls (with the new cool handler).
class CMyUser : public CBobsUser
{
...
CWnd* GetMeAnEditBox()
{
MyEdit* pEdit;
if ( ...some condition... )
pEdit = new MyEdit();
else
pEdit = new MyBobsEdit();
...
return pEdit;
}
}
所以......问题是:
- 为什么这似乎没有受到钻石继承问题的困扰?
- 这个设计有没有我看不到的问题,将来会咬我?
- 如果我不能修改菱形一侧的代码(即我不能在两侧声明 CEdit 虚拟?),是否有另一种方法来解决这个问题?
谢谢!