Una herramienta de verificación estática muestra una violación en el código de abajo:Sobre downcasting de clase base a la subclase puntero
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;
}
mensaje de error: clase hereda 'CSplitFrame' de la clase 'CWnd'
Descripción: Evite arrojar la jerarquía de herencia. Esta regla detecta lanzamientos desde un puntero de clase base a un puntero de subclase.
Beneficios: Permitir moldes en la jerarquía de herencia conduce a problemas de mantenimiento, y la bajada desde una clase base siempre es ilegal.
Referencias:
- Scott Meyers, "A partir de C++: 50 maneras específicas para mejorar sus programas y Diseño", segunda edición, Addison-Wesley, (C) 2005 Pearson Education, Inc., Capítulo : "La herencia y Diseño Orientado a objetos", artículo 39
- ataque conjunto luchador, Vehículo aéreo, C++ Normas de codificación Capítulo 4.23 conversiones de tipos, Regla AV 178
¿Crees que es una buena práctica para no bajar desde un puntero de clase base a un puntero de subclase? ¿Por qué y cuándo debo seguir esta regla?
¿Está ejecutando un analizador estático en el código MFC? ¿Estás bromeando no? MFC rompe muchos estándares de codificación JSF, el código generado por el asistente rompe más, en realidad no está diseñado para la seguridad del tipo. –
BTW: sería una buena idea dejar de llamar subclases de clases derivadas. La derivación/herencia es un concepto sintáctico, la subclasificación es un concepto de tipado, y las dos son ideas más o menos independientes. – Yttrill