• DYNAMIC_DOWNCAST、STATIC_DOWNCAST、CRuntimeClass和IsKindOf


    DYNAMIC_DOWNCAST、STATIC_DOWNCAST、CRuntimeClass和IsKindOf

     

    DYNAMIC_DOWNCAST(class, pointer ):如果pointer指针所指向的对象是class类型的,就返回这个指针。否则返回NULL

    例如 你获取到一个指针 XXX *pointer; 你想判断它是不是指向某个类 ,例如 A 这个类

    A* p= DYNAMIC_DOWNCAST(A, pointer );

    如果pointer是指向A这个类则返回此指针,否则返回空

    CRuntimeClass和IsKindOf的关系

    CRuntimeClass在MFC中的作用很重要,因为MFC利用它来进行类的动态确定,即是通过类变量来判定该变量是否为某一类的实例。由于指针的类型是可以转换的,所以时常会出现从A到B的转换导致错误。而在MFC的各种书籍中对CRuntimeClass的介绍是比较少的,在这里总结它的一些用法。

    动态确定类

       在MFC中

    BOOL CObject::IsKindOf(   

           const CRuntimeClass* pClass  

                   ) const;

    利用CRuntimeClass来进行判定,如果你生成的类是以CFrameWnd为基础的,你可以使用该成员函数来判定。下面举一个例子来加深了解。

    -----------------------------------------------------------------------------------------------------------------------------------------------

    #include <afxwin.h>

    class Type1: public CObject {};        //类型一,从CObject派生

    class Type2: public CFrameWnd {};    //类型二,从CFrameWnd派生

    BOOL IsType1(CObject *pFrameWnd)    //判断函数

    {

         return pFrameWnd->IsKindOf(RUNTIME_CLASS(CFrameWnd));    //判断是不是CFrameWnd的类型,请注意这里的蓝色字体

    }

    BOOL IsType2(CObject *pObject)

    {

        return pObject->IsKindOf(RUNTIME_CLASS(CObject));    //判断是不是CObject类型

    }

    int main()

    {

         Type1 t1;

         Type2 t2;

         ASSERT(IsType1(&t1) == FALSE);    //返回假.因为t1不对应CFrameWnd的类型

         ASSERT(IsType1(&t2) == TRUE);     //正确.t2对应CFrameWnd的类型

        ASSERT(IsType2(&t1) == TRUE);    //t1就是从CObject派生

        ASSERT(IsType2(&t2) == TRUE);    //t2也是从CObject派生   

         return 0;

    }

    STATIC_DOWNCAST

    例如 CDocument* pDoc = STATIC_DOWNCAST(CDocument, pYourDoc);

    If  pYourDoc does not point to a CDocument object, the macro will ASSERT.

    STATIC_DOWNCAST将指向一个类的对象的指针转换为另一个相关类型的指针。在调试版本中,如果该对象不能转换为目标类型,会引起ASSERT。

  • 相关阅读:
    LayoutKind.Explicit 的平台兼容性问题
    Hubble.net V0.7.2.0 版本发布
    HubbleDotNet 开源全文搜索数据库项目数据表的数据类型和索引类型
    .net 下获取和设置时区信息
    .net 程序远程连接 Oracle 数据库
    .Net 应用程序如何在32位操作系统下申请超过2G的内存
    HubbleDotNet开源全文搜索数据库项目如何升级
    盘古分词 V1.2 版本发布
    asp.net mvc源码分析路由篇 如何找到 IHttpHandler
    asp.net mvc源码分析Action篇 IModelBinder
  • 原文地址:https://www.cnblogs.com/profession/p/3966575.html
Copyright © 2020-2023  润新知