我想知道我是否还没有完全理解 C++ 强制转换与旧 C 风格强制转换。在 MFC 中我有这个方法:
CWnd * GetDlgItem(UINT uResId);
我期待一个 CComboBox(或 CEdit),它是 derived来自 CWnd,需要这种转换:
dynamic_cast<CComboBox *>(GetDlgItem(IDC_COMBO1));
// for CEdit:
dynamic_cast<CEdit *>(GetDlgItem(IDC_EDIT1));
但是这个操作导致了使用空指针的崩溃,这意味着转换失败了。使用:
reinterpret_cast<CComboBox *>(GetDlgItem(IDC_COMBO1));
// for CEdit:
reinterpret_cast<CEdit *>(GetDlgItem(IDC_EDIT1));
解决了问题,但我很失望。 我错过了什么?
最佳答案
问题是 GetDlgItem
可能会返回一个临时的 CWnd*
指针。
如果窗口是 CWnd
派生类并且窗口是使用 CWnd::Create(Ex)
创建的或者窗口是子类,RTTI 将工作。
当窗口由 Windows 创建(由于对话框模板)并且窗口不是由 MFC 子类化时(使用 DDX_Control
ow CWnd::SubclassWindow
) ,GetDlgItem
只是返回一个临时的CWnd*
,带有CWnd::FromHandle
。此窗口句柄始终是基本类型 CWnd
。
如果您想检查此窗口是否真的是一个Edit
控件,您可以使用CWnd::GetClassName
。转换为 CEdit*
既安全又方便,因为 CEdit
控件仅通过 Window 消息与其对应的 HWND
进行通信。所以这适用于所有基本的集成窗口类。
关于c++ - MFC 类和 C++ 样式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47324497/