静的チェック ツールは、以下のコードで違反を示します。
class CSplitFrame : public CFrameWnd
...
class CVsApp : public CWinApp
CWnd* CVsApp::GetSheetView(LPCSTR WindowText)
{
CWnd* pWnd = reinterpret_cast<CSplitFrame*>(m_pMainWnd)->m_OutputBar.GetChildWnd(WindowText);
return pWnd;
}
エラー メッセージ:クラス 'CSplitFrame' は、クラス 'CWnd' を継承しています
説明:継承階層を下にキャストしないようにします。このルールは、基本クラス ポインターからサブクラス ポインターへのキャストを検出します。
利点:継承階層の下位へのキャストを許可すると、メンテナンスの問題が発生し、基底クラスからの下位キャストは常に違法になります。
参考文献:
- Scott Meyers、「効果的な C++: プログラムと設計を改善するための 50 の具体的な方法」、第 2 版、Addison-Wesley、(C) 2005 Pearson Education, Inc.、章:「継承とオブジェクト指向設計」、項目 39
- JOINT STRIKE FIGHTER、AIR VEHICLE、C++ コーディング標準、第 4.23 章型変換、AV ルール 178
基本クラスのポインターからサブクラスのポインターにキャスト ダウンしないことは良い習慣だと思いますか? なぜ、いつこのルールに従う必要があるのですか?