Статический инструмент проверка показывает нарушение на код ниже:О понижающее приведение из базового класса подкласс указатель
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»
Описание: Избегайте отбрасывания иерархии наследования. Это правило обнаруживает отливки от указателя базового класса к указателю подкласса.
Привилегии: Предоставление отказов по иерархии наследования приводит к проблемам технического обслуживания, а подавление базового класса всегда является незаконным.
Ссылки:
- Скотт Мейерс "Эффективное использование C++: 50 Конкретные способы улучшить свои программы и дизайн", второе издание, Addison-Wesley, (C) 2005 Pearson Education, Inc., глава : "Наследование и объектно-ориентированное проектирование", пункт 39
- Joint Strike Fighter, АВТОМОБИЛЬ AIR, C++ Coding Standards Глава 4.23 преобразование типов, А. В. Правило 178
Как вы думаете, это хорошая практика для того, чтобы не отбрасывать указатель базового класса на указатель подкласса? Почему и когда я должен следовать этому правилу?
Запуск статического анализатора на код MFC? Ты шутишь, да? MFC сама нарушает многие стандарты кодирования JSF, код, генерируемый мастером, больше ломается, он действительно не предназначен для безопасности типов. –
BTW: было бы неплохо прекратить вызов подклассов производных классов. Деривация/наследование - синтаксическая концепция, подклассификация - это типизированная концепция, и эти два являются более или менее независимыми идеями. – Yttrill