「恐ろしい」ダイヤモンドの継承問題に苦しんでいるはずのケースを見つけたようです。ただし、コードは問題なく動作するようです。確かに把握できないように見えるのは、問題がある可能性があるかどうかです。
これがセットアップです。私は MFC を使用しており、マウス クリック ウィンドウ メッセージのカスタム処理を追加するために CEdit を拡張しました。次に、このクラスと、サード パーティの開発者 (この例では 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 virtual を宣言できない場合)、これを修正する別の方法はありますか?
ありがとう!