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。
DYNAMIC_DOWNCAST、STATIC_DOWNCAST、CRuntimeClass和IsKindOf的更多相关文章
- C++:实现类似MFC的IsKindOf功能
假设需要一个类别库,改类别库共包含以下5个类:GrandFather(祖父类).Father(父类).Son(儿子类).Daughter(女儿类).GrandSon(孙子类) 各个类之间的继承关系为: ...
- quick: iskindof使用注意
quick: iskindof使用注意 --[[-- 如果对象是指定类或其子类的实例,返回 true,否则返回 false ~~~ lua local Animal = class("Ani ...
- 无法解析的外部符号 "public: virtual struct CRuntimeClass * _
SetupPropertyPage.obj : error LNK2001: 无法解析的外部符号 "public: virtual struct CRuntimeClass * __this ...
- isMemberOf与isKindOf的区别
这两个方法常常会困惑我们,它们有什么区别呢? 定义 首先,我们来看看它们的定义. isKindOfClass: 官方解释:Returns a Boolean value that indicates ...
- (转)MFC的一些宏的整理 (DECLARE_DYNCREATE/IMPLEMENT_DYNCREATE)
很早看了MFC的一些宏的实现,什么RUNTIME_CLASS, DECLARE_DYNAMIC, DECLARE_DYNCREATE,IMPLEMENT_DYNCREATE, etc,看了就烦,现在整 ...
- VC++/MFC 最常用宏和指令
1.#include指令 包含指定的文件,最基本的最熟悉的指令,编程中不得不用,包含库文件用双尖括号,包含自定义头文件用双引号. 2.#define指令 预定义,通常用它来定义常量(包括无参量与 ...
- [转载]学习VC MFC开发必须了解的常用宏和指令————复习一下
1.#include指令 包含指定的文件 2.#define指令 预定义,通常用它来定义常量(包括无参量与带参量),以及用来实现那些“表面似和善.背后一长串”的宏,它本身并不在编译过程中进行,而 ...
- 牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结 转载
基础篇:操作系统.计算机网络.设计模式 一:操作系统 1. 进程的有哪几种状态,状态转换图,及导致转换的事件. 2. 进程与线程的区别. 3. 进程通信的几种方式. 4. 线程同步几种方式.(一定要会 ...
- 【转】牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结
基础篇:操作系统.计算机网络.设计模式 一:操作系统 1. 进程的有哪几种状态,状态转换图,及导致转换的事件. 2. 进程与线程的区别. 3. 进程通信的几种方式. 4. 线程同步几种方式.(一定要会 ...
随机推荐
- new work
果不其然,还是电子工程师适合我.
- javascript的词法分析
-.arguments的解释: 1.是一个对象,是一个长的很像数组的对象 二.arguments内容是什么? 1.arguments是函数运行时的实参列表 2.arguments收集的“所有”的实参, ...
- 升级IOS 9 和 XCode 7 引起的问题
问题一: 升级xcode 7最低的系统配置要求 升级了ios9 后使用 xcode 6.1 已经不能用了,必须升级 xcode 7才行,原先的系统是OSX 10.10.1 版本.而xcode 7.0 ...
- Android沉浸式(侵入式)标题栏(状态栏)Status(三)
Android沉浸式(侵入式)标题栏(状态栏)Status(三) 从附录文章1,2可以看到,依靠Android系统提供的标准方案,状态栏即便在透明状态下,仍然有些半透明而不是全透明.本文是And ...
- Js验证userAgent是否来自手机端
function GetQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&] ...
- Rest文件下载
public void DownloadFile(string fileId) { //Stream fileStream = null; try { int fileID = Convert.ToI ...
- IFrame 获取内容
试试: iframe.contentwindow.document.documentElement.innerHTML document.getElementById("MyIFrame ...
- magento搬家步骤和可能遇到的问题
将原来网站文件中的var文件中的cache和session文件删除,将media中的缓存文件删除.然后将所有文件制作成一个压缩包,以减少文件体积,方便转移. 将压缩包转移到新的服务器域名指向的文件夹, ...
- 转载blog_Linux下Tomcat日志定期清理 及 logrotate 配置
服务器上的tomcat的catalina.out文件越来越大,查看起来很不方便,以前每次都是想起来的时候手工清理一下(cat /dev/null > catalina.out),后来发现了log ...
- 一直纠结中的"底层模板"含义(借鉴)
无意间看到这个解释,推荐给哪些和我一样迷惑的人!