静态检查工具显示违反以下代码:
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 种改进程序和设计的具体方法”,第二版,Addison-Wesley,(C) 2005 Pearson Education, Inc.,章节:“继承和面向对象的设计”,第 39 项
- JOINT STRIKE FIGHTER, AIR VEHICLE, C++ 编码标准第 4.23 章类型转换,AV 规则 178
您认为不从基类指针向下转换为子类指针是一个好习惯吗?为什么以及何时我应该遵守这条规则?