详解MFC运行时类信息机制

MFC 详解一之重要的类 最近好久没用vs下的mfc工程了,感觉对于mfc越来越感到莫名的陌生不了解,网上也看到好多关于mfc的深入了解的博客,其中liyi268这位前辈对于mfc六大机制总结的很到位,还有就是《深入浅出 MFC》侯俊杰的这本书更是没话说,一直犹豫要不要写mfc方面的博客,最终想想为什么不写呢,也许自身的水平有限,也许投入写mfc博客的时间会比较长,但是自身总结一方面能加深印象,促使自己更加深入的了解,一方 阅读详情

作用

在程序运行过程中可以获知对象的类的相关信息(例如对象是否属于某个类)

使用条件

  1. 类派生自CObject
  2. 类内添加声明宏 DECLARE_DYNAMIC(theClass)
  3. 类外添加实现宏 IMPLEMENT_DYNAMIC(theClass, baseClass)

使用方式

类对象名.IsKindOf(RUNTIME_CLASS(想要判断是否在其中的类名))

使用代码示例

//掐头
class CMonster:public CObject
{
    DECLARE_DYNAMIC(CMonster)
};
IMPLEMENT_DYNAMIC(CMonster, CObject)

int main()
{
    CMonster Shrem;
    if(shrem.IsKindOf(RUNTIME_CLASS(CMonster)))
    {
        std::cout << "Shrem is Monster" << std::endl;
    }
    else
    {
        std::cout << "Shrem is not Monster" << std::endl;
    }    
}
//去尾

你如果没有需求的话就不用往下看原理了,挺绕的

原理

把我们在上述代码中书写的宏展开后,其实就相当于在类内添加了public属性的一个静态变量(结构体)和一个虚函数

static const CRuntimeClass classCMonster;

virtual CRuntimeClass* GetRuntimeClass() const

静态变量和虚函数返回值都牵扯到CRunTimeClass结构体

CRunTimeClass详细介绍去MSDN查看,此处只介绍成员变量

 运行时类信息机制能用到的CRunTimeClass结构体的成员变量就只有前三个

        本类的CRunTimeClass结构体的第三成员指针指向父类的CRunTimeClass结构体,层层继承之下,每个类的CRunTimeClass成员的指针都指向父类结构体,于是就形成了一个链表,最子类的结构体就是链表头,CObject类(最基类)的CRunTimeClass成员就是链表尾,且其CRunTimeClass的第三成员指针为NULL。

virtual CRuntimeClass* GetRuntimeClass() const函数的作用

返回本函数所在类的CRunTimeClass静态变量的地址

RUNTIME_CLASS宏的作用

RUNTIME_CLASS代换内容如下:

//RUNTIME_CLASS(CMonster)
//↓↓↓↓↓↓↓↓
((CRuntimeClass*)(&CMonster::classCMonster))

可以看出,RUNTIME_CLASS的作用即得到参数传递的类对象的CRunTimeClass静态变量的地址

IsKindOf函数执行流程

IsKindOf函数定义:BOOL CObject::IsKindOf(const CRuntimeClass*pClass) const

1. 参数RUNTIME_CLASS(CObject)能够拿到CObject类的CRunTimeClass成员地址

2. 调用本类的GetRuntiomClass虚函数,将链表头地址保存到pClassThis中

3. 函数最后pClassThis -> IsDerivedFrom(pClass),调用IsDerivedFrom函数

4. 在IsDerivedFrom函数内部有一个循环,从链表头开始遍历链表寻找是不是有个节点的地址跟传参的地址一样,有的话返回true,没有返回false,继而IsKindOf也会根据IsDerivedFrom的返回值返回。

MFC CRuntimeClass 学习 CRuntimeClass 是一个在MFC中用于管理和存储有关类类型的信息的类; 阅读详情

相关推荐

MFC框架仿真实战:深入理解IsKindOf()函数的型别辨识功能

MFC(Microsoft Foundation Classes)是一个C++库,它提供了一套丰富的类,用于简化Windows平台下应用程序的开发。MFC封装了Windows API的复杂性,让开发者能够以面向对象的方式进行编程。使用MFC,开发者可以利用类的继承、多态等面向对象的特性,构建功能丰富的应用程序。MFC的类层次结构是基于单根继承树设计的,其顶层是CObject类,几乎所有其他的MFC类都是从CObject派生的。CObject类提供了序列化、动态创建、对象诊断等特性。

weixin_34511754的博客 1023

MFC的CRuntimeClass分析

一、CRuntimeClass背景介绍 MSDN:对于MFC中每个从CObject派生的类来说,都有一个相关的CRuntimeClass结构体,在程序运行时可以访问该结构体来获取对象及其基类的运行时信息。 CRuntimeClass是一个结构体,并且其本身并没有基类。在运行时确定一个对象的类型是很重要的,尤其是在做类型检查时;而C++语言本身并不支持运行时类信息。CObject和CRuntim...

sinat_31608641的博客 2491

深入剖析MFC运行机制与核心基础详解

MFC(Microsoft Foundation Classes)是微软为简化Windows应用程序开发而推出的一套C++类库,它封装了大量Windows API,并引入面向对象的设计思想,使开发者能够以更高效、更结构化的方式构建复杂的桌面应用。本章将深入剖析MFC的整体架构,解析其基于C++的封装机制与设计哲学,重点阐述MFC如何通过类继承体系、宏定义和运行时类型识别(RTTI)、动态创建等技术实现对Windows SDK的高级抽象。

weixin_28809949的博客 1137

IsKindOf()函数

原文链接: http://blog.youkuaiyun.com/liang_lq/article/details/6191383 知道有IsKindOf这么个函数,用来检测:(1)对象是否属于指定的类,(2)对象是否属于指定类派生的类,但是一直没用过,今天用了下,提示错误errorC2039: 'classXXX' : is not a member of'XXX',查了很多资料,才把它搞明白,

Maybe 859

利用python爬取东方财富网股吧评论并进行情感分析(一)

利用python爬取东方财富网股吧评论(一) python-东方财富网贴吧文本数据爬取 分享一下写论文时爬数据用到的代码,有什么问题或者改善的建议的话小伙伴们一起评论区讨论。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会带来全新的写作体验; 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示; 增加了 图片拖拽 功能,你可以将本地的图片直

YMG521000的博客 1万+

全同态加密:CKKS

不论是 LSB 编码的 BGV,还是 MSB 编码的 BFV,它们的同态运算都是对 $\mathbb Z_t$ 上明文的**精确计算**,因为**密文中的明文空间和噪声空间是分离的**。例如,在 BGV 中是 $te+m$,在 BFV 中是 $\delta m+e$。但是,这种精确计算是在同余意义下的,如果将明文视为实数,那么实际上同态运算时的噪声破坏了明文的 MSB $\lfloor m/t \rfloor$,仅保留了 LSB $[m]_t$,

weixin_44885334的博客 7549

MFC运行时类信息机制及动态创建机制

前面几篇文章解介绍了MFC的程序启动机制、窗口创建机制以及消息映射机制。今天将介绍MFC另外的两大机制运行时类信息机制和动态创建机制。 运行时类信息机制是动态创建的基础。动态创建机制是在运行时类信息机制的基础上实现的。运行时类信息机制就是知道对象属于那个类,就像我们C++使用的typeid运算子一样。 MFC的动态创建机制就是运行时类信息的结构的基础上动态的创建对象,接下来详细的介绍这两种机制。

qq_43725310的博客 1357

水下探测小白必看:单波束vs多波束声呐,5分钟搞懂核心区别

本文为水下探测新手清晰解析了单波束与多波束声呐的核心区别。单波束声呐如同精准的“手电筒”,进行逐点扫描,适用于定点测深和目标探测;而多波束声呐则像“聚光灯”,能一次性覆盖一个扇区,高效获取海底地形三维信息,是海底测绘和水下三维建模的理想选择。文章通过生动的比喻和对比表格,帮助读者快速理解两者原理、效率差异及适用场景。

linux6sysadmin的博客 1049

MFC 运行时类信息机制

MFC 运行时类信息机制

qq_61553520的博客 954

STM32CubeMX-电机控制2-电机相关配置部分

STM32CubeMX-电机霍尔传感器 写在前面的话:之前一直使用库函数,调程序时总会觉得是配置出现问题,要画一些时间去检查配置程序,所以目前转到了STM32CubeMX。写这些内容一方面是整理记录,因为是刚入门,所以难免出现错误,希望能得到大家指正;另一方面是因为自己一个人调试,走了很多弯路,写下来希望能给相同处境的人一些参考。 步骤一: 电机霍尔传感器接口 我目前使用的是STM32F4,电机的...

niker_co的博客 1万+

flowable工作流源码解析-DB访问

Flowable用了mybatis组件,又实现了自己的command和interceptor机制。具体是怎么实现的呢? 我们以Deployment操作为例,来看看它的调用链 调用端是Service接口, 它委托自己的commandExecutor去执行具体的Command. Command最终会调用到EntityManager,然后委托给ibatis的sqlsession来完成操作。 其中CommandExcutor调用command的地方有些复杂,我们展开看: CommandExecutor会维护一系

coobee的博客 2488

MFC程序设计(七)运行时类信息机制

我们在创建对象时,自己是清楚对象属于哪个类,但是计算机却不清楚。而MFC运行时类信息机制就是解决这个问题而存在的。

2301_78838647的博客 691

【毕业设计之python系列】基于Flask的在线音乐网设计与实现

本论文旨在通过使用Python的Web框架Flask,设计和实现一个具有完整功能的在线音乐网站。该网站包括用户注册、登录、注销、歌曲上传、编辑、删除、歌单创建、编辑、删除、评论、搜索、音乐播放等功能,并针对不同用户角色(如普通用户、管理员)实现了不同的权限管理。同时,本论文还介绍了如何使用第三方API(如网易云音乐API)获取歌曲信息等技术实现。在设计上,本论文采用了MVC(Model-View-Controller)架构模式,将后端数据处理与前端展示分离,以便于代码的管理和维护。在数据库设计方面,本论文设

m0_56073435的博客 3248

MFC框架机制详解

MFC框架机制详解

zt_xcyk的专栏 8218

华为OD机试 - 字符串筛选排序 - 数组(Python/JS/C/C++ 双机位C卷 100分)

k如果大于字符串长度则输出最大ASCII码值的字母所在字符串的位置索引,如果第k个最小ASCII码值的字母存在重复 则输出该字母的最小位置索引。输入一个由N个大小写字母组成的字符串,按照ASCII码值从小到大进行排序,查找字符串中第K个最小ASCII码值的字母(k>=1)。k如果大于字符串长度则输出最大ASCII码值的字母所在字符串的位置索引,如果有重复字母则输出字母的最小位置索引。输出字符串中第k个最小ASCII码值的字母所在字符串的位置索引。第二行输入k ,k必须大于0 ,k可以大于输入字符串的长度。

学Java,找哪吒 1392

运行后选择GDB/LLDB出现这样的窗口:launch: program ‘输入程序名称,例如 D:\Desktop\新建文件夹\a.exe‘ does not exist...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1132

【上位机——MFC】运行时类信息机制

【上位机——MFC】运行时类信息机制

weixin_39723539的博客 473

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

四、MFC工具栏、运行时类信息机制、运行时创建机制

一、工具栏1、相关类2、工具栏的使用(1)添加工具栏资源(2)创建工具栏CToolBarCreateEx(3)加载工具栏CToolBar(4)设置工具栏的停靠(与框架窗口的关系)3、创建项目,添加工具栏(1)创建项目(MFCToolBar)(2)添加.rc资源文件,添加菜单(3)编写代码,绑定菜单(4)添加工具栏资源(5)绑定工具栏代码(6)设置工具栏停靠代码。...

liutit的博客 386

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

MFC六大机制(四)运行时类信息机制

一、作用:可以知道一个对象是否属于某一个类 二、使用: 1、必须直接或间接继承CObject类 2、添加声明宏DECLARE_DYNAMIC(CDog) 3、添加实现宏IMPLEMENT_DYNAMIC(CDog, CAnimal) 三、具体实例 1 class CAnimal : public CObject 2 { 3 DECLARE_DYN...

banwan6368的博客 165

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【MFC学习】运行时类信息机制

MFC学习

qq_43057661的博客 446

MFC(五)运行时类信息机制 动态创建机制 序列化机制

世上的事,会则不难,难则不会~ WIN32学习起来也并不简单,而到了MFC,框架6大机制相当复杂,学习就更加困难。 迎着困难向上~其实也就没有那么难了~...

AouSdu 1322

MFC:MFC六大核心机制之—运行时类型识别RTTI

MFC六大核心机制之—运行时类型识别RTTI:1.介绍了RTTI;2.为什么RTTI能成为MFC的六大核心机制之一;3.MFC是如何实现RTTI机制的;4.两个重要的宏宏DECLARE_DYNAMIC和宏IMPLEMENT_DYNAMIC

qq_42279379的博客 639

5.MFC基础(五)视图、运行时类信息、动态创建

一、MFC的视图窗口  1.相关问题    视图窗口:提供了一个用于显示数据的窗口,并和用户进行交互操作  2.相关的类    CView及其子类 - 父类CWnd,封装了关于视图窗口的操作  3.视图窗口的使用   (1)从CView类派生一个自己的视图类(CMyView),并必须重写父类的纯虚函数OnDraw      当CView类帮我们处理WM_PAINT消息时将调...

diandao9056的博客 307

MFC初窥(MFC运行机制,孙鑫C++第三讲笔记整理)

有了一定的Windows32编程知识,就能学习MFC了。 在学习MFC之前,一定要弄明白Windows32编程中的消息循环是怎么回事。MFC实际上就是对Windows API函数的封装。   在Windows程序设计编程中,创建一个窗口要经历下面四个过程 (如有不懂,请看博客 win32初窥) 1设计一个窗口类; 2注册窗口类; 3创建窗口; 4显示及更新窗口。   同样,M

hellokazhang的博客 4567
上一篇: 极简fseek()函数讲解,一分钟掌握
下一篇: 无辅助空间交换值的三种方式【所有语言通用】
hx___y
博客等级 码龄6年 5粉丝 10原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值