Давайте рассмотрим некоторые из приведенных ниже примеров в MFC:
CButton * из CWnd *
CWnd* wnd = GetDlgItem(IDC_BUTTON_ID);
CButton* btn = dynamic_cast<CButton*>(wnd);
CChildWnd * из CFrameWnd *
CChildWnd * pChild = ((CSplitFrame*)(AfxGetApp()->m_pMainWnd))->GetActive();
Тамдействительно некоторые из ограничений дизайна MFC.
Благодаря тому, что CWnd обеспечивает базовую функциональность всех оконных классов в MFC, он даже служит базовым классом View, Dialog, Button и т. Д.
Если мы хотим избежать снижения рейтинга, возможно,нам нужен MFC-хакер, чтобы разделить CWnd на меньшее количество частей?
Теперь перейдем к другому вопросу: как устранить нарушение, мое скромное мнение состоит в том, чтобы попытаться избежать небезопасного понижения рейтинга с помощью безопасного понижения рейтинга:
Parent *pParent = new Parent;
Parent *pChild = new Child;
Child *p1 = static_cast<Child*>(pParent); // Unsafe downcasting:it assigns the address of a base-class object (Parent) to a derived class (Child) pointer
Parent *p2 = static_cast<Child*>(pChild); // Safe downcasting:it assigns the address of a derived-class object to a base-class pointer
Это хорошая практика для использования безопасного даункинга, хотя нарушение все еще существует, мы просто подавим нарушение с помощью данного объяснения.
Немного полезной ссылки:
http://support.microsoft.com/kb/108587
http://blog.csdn.net/ecai/archive/2004/06/26/27458.aspx
http://www.codeproject.com/KB/mcpp/castingbasics.aspx
http://www.bogotobogo.com/cplusplus/upcasting_downcasting.html
Наконец, спасибо за различные полезные ответы от всех вас.
Они действительно очень полезны.