"恐ろしい"ダイヤモンドの継承問題に苦しんでいるはずのケースを見つけたようです。しかし、コードは正常に動作するように見えます。 がの場合、私が確かに把握できないことが問題です。サードパーティライブラリを使用したダイヤモンド継承の問題
ここに設定があります。私は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のを宣言することはできません?)
感謝を!
派生クラスのいずれも仮想関数またはデータメンバーを実装していない場合、それらの間にwilly-nillyをキャストできます。通常、これはC++コミュニティには不明なコンパイラ特有の動作に依存していますが、MFCはこれに大きく依存していますので、安全でなければなりません。 –