其他分享
首页 > 其他分享> > DYNAMIC_DOWNCAST 和 dynamic_cast

DYNAMIC_DOWNCAST 和 dynamic_cast

作者:互联网

DYNAMIC_DOWNCAST

 DYNAMIC_DOWNCAST  是MFC中的,字面意思是,“动态向下转型”,主要用于 父类指针 转换为 子类指针,安全,可以用返回是否为 NULL 判断;而用强制转换,不安全。
必须是由MFC中的CObject派生,且支持了RTTI(运行时类型识别)
例如:
// 这个object参数,就是pointer(指针)
#define DYNAMIC_DOWNCAST(class_name, object) \
    (class_name*)AfxDynamicDownCast(RUNTIME_CLASS(class_name), object)
    
CObject* AFX_CDECL AfxDynamicDownCast(CRuntimeClass* pClass, CObject* pObject)
{
    if(pObject != NULL && pObject->IsKindOf(pClass))
        return pObject;
    else
        return NULL;
}

//使用方法
class_name* p = DYNAMIC_DOWNCAST(class_name, pointer);
//将指针pointer安全地转换为 class_name* ,若pointer确是指向class_name类型的对象,则返回适当的指针;否则,返回NULL

//强制类型转换(不安全),因为,若pointer不指向class_name类型的对象,没有提示,后续的操作会异常。
class_name* p = (class_name*)pointer;

//自己写了个MFC对话框类 CMFCDialogDlg,继承CDialog -> CWnd
    CWnd* pWnd = new CMFCDialogDlg;
    CMFCDialogDlg* pDlg = DYNAMIC_DOWNCAST(CMFCDialogDlg, pWnd);//ok
    ASSERT(pDlg);
    CView* pV = DYNAMIC_DOWNCAST(CView, pWnd);//NULL
    ASSERT(pV);
    

dynamic_cast

dynamic_cast 是C++标准里的,一般都可以使用,包括向下转型(父->子)、向上转型(子->父)。
可以看看这篇博客:C++强制类型转换:static_cast、dynamic_cast、const_cast、reinterpret_cast
例如:
class Base{};
class Derived :public Base
{
    //...
};
Base* pB = new Derived;
Derived* pD = dynamic_cast<Derived*>(pB);

标签:name,DOWNCAST,DYNAMIC,dynamic,cast,pointer,class
来源: https://www.cnblogs.com/htj10/p/13053802.html