博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DYNAMIC_DOWNCAST STATIC_DOWNCAST IsKindOf
阅读量:5115 次
发布时间:2019-06-13

本文共 1501 字,大约阅读时间需要 5 分钟。

 

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

pwnd 你获取到的指针

class 你的类

class A;

例如 你获取到一个指针 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 Type1public CObject {};        //类型一,从CObject派生

class Type2public 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

强制转换为指向 CYourDocument,称为 pYourDoc 是指向 CDocument 使用下面的表达式的指针的指针:  

CDocument* pDoc = STATIC_DOWNCAST(CDocument, pYourDoc);

转载于:https://www.cnblogs.com/bigbigtree/archive/2011/12/16/2289793.html

你可能感兴趣的文章
待整理
查看>>
一次动态sql查询订单数据的设计
查看>>
C# 类(10) 抽象类.
查看>>
Vue_(组件通讯)子组件向父组件传值
查看>>
jvm参数
查看>>
我对前端MVC的理解
查看>>
Silverlight实用窍门系列:19.Silverlight调用webservice上传多个文件【附带源码实例】...
查看>>
2016.3.31考试心得
查看>>
mmap和MappedByteBuffer
查看>>
Linux的基本操作
查看>>
转-求解最大连续子数组的算法
查看>>
对数器的使用
查看>>
【ASP.NET】演绎GridView基本操作事件
查看>>
ubuntu无法解析主机错误与解决的方法
查看>>
尚学堂Java面试题整理
查看>>
MySQL表的四种分区类型
查看>>
[BZOJ 3489] A simple rmq problem 【可持久化树套树】
查看>>
STM32单片机使用注意事项
查看>>
swing入门教程
查看>>
好莱坞十大导演排名及其代表作,你看过多少?
查看>>