框架原理第二讲,RTTI,运行时类型识别.(以MFC框架讲解)
框架原理第二讲,RTTI,运行时类型识别.(以MFC框架讲解)
一丶什么是RTTI,以及RTTI怎么设计
通过第一讲,我们知道了怎么样升成一个窗口了,以及简单的消息循环.
第二讲则是主要讲解RTTI
什么是RTTI,RTTI 简单来多就是我根据一个字符串,来new一个对象
例如:
CObject * pThis = (Cobject *)Getobj("CObject"); 反回的是实例对象
但是具体怎么做
首先我们要解决的问题
1.我们要知道子类的名字
2.怎么识别子类的父类
关于第一种,我们可以在我们每个框架里面,添加一个虚函数,名字叫做 GetClassName既可.
第二种,关键是怎么识别子类和父类.
这就比较难办了.此时我们可以给每个类中加入一个静态的链表
链表保存的信息
class CRtti
{
public:
const char *pClasName;
CRtti *pBase;
void* (*CreateObj)();
};
第一个我们可以给自己的类名
第二个我们可以给父类的对象
第三个我们可以给个函数指针,而且每个类中都要实现这个函数指针.这样我们就可以保存自己的名字,以及父类的信息了.
关于为什么是链表保存,这个就属于是设计了.
二丶MFC中的RTTI
通过上面的讲解,我们理解了什么是RTTI,那么对应到MFC的框架中,我们看一下MFC是怎么做的
class CMyRuntimeClass
{
public:
// Attributes
LPCSTR m_lpszClassName; //名字
int m_nObjectSize; //对象大小
UINT m_wSchema; //版本号
CMyObject* (*m_pfnCreateObject)(); //创建对象的函数指针
CMyRuntimeClass* m_pBaseClass; //基类
CMyRuntimeClass* m_pNextClass; //下一个基类
void *pInit; //初始化数据
};
可以看出,MFC框架中,成员保存的比我们的多,且加了很多额外属性
但是核心属性是不变的.
三丶理解RTTI的实现,以及框架过程.
在新的框架中,我们仿照MFC 分别添加了
1. CMyMainFrom 类, 这个类是框架类
2. CMyView类 视图类
3. CMyDocument, 数据类
上面三个是框架类
而当我们点击类向导的时候,会自动生成的,现在是添加用户自己的类
1.CTestDoc 继承 CMyDocument
2.CTestFrom继承 CMyMainFrom
3.CTestView继承 CMyView
既然我们了解了RTTI类型识别,那么我们就要设计,并且实现了.
一丶CMyObject中添加类型识别.

声明和实现我们用宏替代.

二丶CMyObject中添加实现方法

实现
实现一,初始化RTTI表

实现二,函数返回自己本身.

三丶每个类中都添加RTTI表,并且初始化
每个类中都添加相同的静态成员,所以很麻烦,为了减少代码量,所以都变成了上面的宏了.

MY_DECLARE_DYNAMIC 这个宏是我们上面定义的.直接添加类成员的.
实现

每个框架类实现这个既可.
代码下载:
链接:https://pan.baidu.com/s/1hsOsfMO 密码:m1xo
框架原理第二讲,RTTI,运行时类型识别.(以MFC框架讲解)的更多相关文章
- 框架原理第三讲,RTTCreate,运行时类型创建.(以MFC框架讲解)
框架原理第三讲,RTTCreate,运行时类型创建.(以MFC框架讲解) 通过昨天的讲解,我们已经理解了运行时类型识别是什么. 比如 CObject * pthis = (Cobject *)Cre ...
- MFC原理第三讲.RTTI运行时类型识别
MFC原理第三讲.RTTI运行时类型识别 一丶什么是RTTI RTTI. 运行时的时候类型的识别. 运行时类型信息程序.能够使用基类(父类)指针 或者引用 来检查这些指针或者引用所指的对象. 实际派生 ...
- RTTI 运行时类型识别 及异常处理
RTTI 运行时类型识别 typeid ------ dynamic_cast dynamic_cast 注意事项: 1.只能应用于指针和引用之间的转化 2.要转换的类型中必须包含虚函数 3. ...
- 框架原理第一讲,熟悉常用的设计方式.(以MFC框架讲解)
框架原理第一讲,熟悉常用的设计方式.(以MFC框架讲解) 一丶什么是框架,以及框架的作用 什么是框架? 框架,简而言之就是把东西封装好了,使用框架开发可以快速开发程序,例如MFC程序的双击写代码. 为 ...
- Java基础之RTTI 运行时类型识别
运行时类型识别(RTTI, Run-Time Type Identification)是Java中非常有用的机制,在Java运行时,RTTI维护类的相关信息. 多态(polymorphism)是基于R ...
- RTTI(运行时类型识别)
C++为了能够在运行时正确判断一个对象确切的类型,加入了RTTI和type_info. type_info 为每一个类型增加一个type_info对象. 为了能够在运行时获得对象的类型信息type_i ...
- RTTI(运行时类型识别),typeid,dynamic_cast
dynamic_cast注意: 1.只能应用于指针和引用的转换: 2.要转换的类型中必须包含虚函数: 3.转换成功则返回地址,如果失败则返回NULL: 参见项目:RTTI
- RTTI (Run-Time Type Identification,通过运行时类型识别) 转
参考一: RTTI(Run-Time Type Identification,通过运行时类型识别)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型. RTTI提供了以下两个 ...
- MFC六大核心机制之二:运行时类型识别(RTTI)
上一节讲的是MFC六大核心机制之一:MFC程序的初始化,本节继续讲解MFC六大核心机制之二:运行时类型识别(RTTI). typeid运算子 运行时类型识别(RTTI)即是程序执行过程中知道某个对象属 ...
随机推荐
- phpstorm-----实现实时编辑服务器代码
phpstorm是一款功能强大.广大码农钟爱的编辑器,也是我最常用的编辑器.这里介绍一个偷懒的功能. 用sftp协议与远程服务器相连接,实现直接编辑服务器代码的功能.而效果就是ctrl+s不仅可以保存 ...
- JAVA基础2——类初始化相关执行顺序
类初始化相关执行顺序 几个概念说明 代码块的含义与作用 static静态代码块: 一般用于初始化类中的静态变量.比如:给静态的数组或者list变量赋初值.使用static静态代码块进行初始化与直接在定 ...
- 一个简单的迷你jQuery实现
//仅提供与学习使用(function () { var _$ = window.$; var _jQuery = window.jQuery; //暴露外部使用的一个接口 var jQuery = ...
- Java第二季
1.封装 (1)概念 将类的某些信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问. (2)封装的实现步骤 2.Java中的访问修饰符 3.继承 (1)Ja ...
- lodash源码分析之chunk的尺与刀
以不正义开始的事情,必须用罪恶使它巩固. --莎士比亚<麦克白> 最近很多事似乎印证了这句话,一句谎言最后要用一百句谎言来圆谎. 本文为读 lodash 源码的第二篇,后续文章会更新到这个 ...
- gitup问题的处理
在使用本地建立git仓库后,准备使用 因为之前已经登录了,所以没有给登录的命令行 1.git init 命令初始化仓库 2.git add . 命令将所有的文件传输到git仓库 ...
- codeforces 893D Credit Card 贪心 思维
codeforces 893D Credit Card 题目大意: 有一张信用卡可以使用,每天白天都可以去给卡充钱.到了晚上,进入银行对卡的操作时间,操作有三种: 1.\(a_i>0\) 银行会 ...
- QT之UDP通信
前言:前一篇讲了TCP通信,这篇来看看UDP通信. 这里说明一下,UDP通信中分为三种通信分别为单播.组播和广播,下面将一一为大家介绍. 同样的我们都需要在工程文件中添加network QT += c ...
- flask_login 整合 pyjwt + json 简易flask框架
现在很多框架都实现前后端分离,主要为了适应以下几个目的: 1,前后端的分离,可以使前端开发和后端开发更加分工明确,而不是后端还需要在视图模板中加入很多{% XXXX %}标签 2,是为了适应跨域调用或 ...
- python3 爬虫---爬取糗事百科
这次爬取的网站是糗事百科,网址是:http://www.qiushibaike.com/hot/page/1 分析网址,参数''指的是页数,第二页就是'/page/2',以此类推... 一.分析网页 ...