Uno strumento di verifica statica mostra una violazione del codice qui sotto:Chi downcasting dalla classe base per creare una sottoclasse puntatore
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;
}
messaggio di errore: Class 'CSplitFrame' eredita dalla classe 'CWnd'
Descrizione: Evita la gerarchia dell'ereditarietà. Questa regola rileva i cast da un puntatore di classe base a un puntatore sottoclasse.
Vantaggi: La riduzione della gerarchia dell'ereditarietà causa problemi di manutenzione e il downcasting da una classe base è sempre illegale.
Riferimenti:
- Scott Meyers, "Effective C++: 50 modi specifici per migliorare i programmi e design", seconda edizione, Addison-Wesley, (C) 2005 Pearson Education, Inc., Capitolo : "eredità e progettazione object-oriented", punto 39
- Joint Strike Fighter, trasporto aereo, C++ standard di codifica capitolo 4.23 Conversioni di tipo, Regola AV 178
Pensi che sia una buona pratica non scartare da un puntatore di classe base a un puntatore sottoclasse? Perché e quando dovrei seguire questa regola?
Esecuzione di un analizzatore statico sul codice MFC? Stai scherzando vero? Lo stesso MFC rompe molti standard di codifica JSF, il codice generato dalla procedura guidata si rompe di più, in realtà non è progettato per la sicurezza del tipo. –
BTW: sarebbe una buona idea smettere di chiamare sottoclassi di classi derivate. La derivazione/ereditarietà è un concetto sintattico, la sottoclassi è un concetto di battitura, e le due idee sono più o meno indipendenti. – Yttrill