框架原理第二讲,RTTI,运行时类型识别.(以MFC框架讲解)
2017-12-20 14:23
369 查看
框架原理第二讲,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中添加类型识别.
![](https://images2017.cnblogs.com/blog/1197364/201712/1197364-20171220134931021-111687831.png)
声明和实现我们用宏替代.
![](https://images2017.cnblogs.com/blog/1197364/201712/1197364-20171220135105100-510822916.png)
二丶CMyObject中添加实现方法
![](https://images2017.cnblogs.com/blog/1197364/201712/1197364-20171220135155787-106149425.png)
实现
实现一,初始化RTTI表
![](https://images2017.cnblogs.com/blog/1197364/201712/1197364-20171220135910990-1834389607.png)
实现二,函数返回自己本身.
![](https://images2017.cnblogs.com/blog/1197364/201712/1197364-20171220135219412-689702769.png)
三丶每个类中都添加RTTI表,并且初始化
每个类中都添加相同的静态成员,所以很麻烦,为了减少代码量,所以都变成了上面的宏了.
![](https://images2017.cnblogs.com/blog/1197364/201712/1197364-20171220140220209-7298375.png)
MY_DECLARE_DYNAMIC 这个宏是我们上面定义的.直接添加类成员的.
实现
![](https://images2017.cnblogs.com/blog/1197364/201712/1197364-20171220140409881-885659415.png)
每个框架类实现这个既可.
代码下载:
链接:https://pan.baidu.com/s/1hsOsfMO 密码:m1xo
相关文章推荐
- 框架原理第三讲,RTTCreate,运行时类型创建.(以MFC框架讲解)
- MFC六大关键技术之运行时类型识别(RTTI)
- MFC六大关键技术之(二)——运行时类型识别(RTTI)
- C++杂记:运行时类型识别(RTTI)与动态类型转换原理
- MFC运行时类型识别(MFC RTTI)与动态创建
- MFC六大核心机制之二:运行时类型识别(RTTI)
- MFC六大关键技术之运行时类型识别(RTTI)
- MFC中RTTI 运行时类型识别 的模拟实现
- MFC六大关键技术之(二)——运行时类型识别(RTTI)
- MFC六大关键技术之(二)——运行时类型识别(RTTI)
- MFC六大核心机制之二:运行时类型识别(RTTI)
- 【转载】C/C++杂记:运行时类型识别(RTTI)与动态类型转换原理
- MFC中的RTTI(Runtime Type Identification, 运行时类型识别)详解(参考《深入浅出MFC》)
- 举例讲解Java的RTTI运行时类型识别机制
- MFC六大核心机制之二:运行时类型识别(RTTI)
- MFC六大核心机制之二:运行时类型识别(RTTI)
- MFC六大关键技术之(二)——运行时类型识别(RTTI)
- MFC 六大机制 (2) RTTI(运行时类型识别)
- MFC六大关键技术之(二)——运行时类型识别(RTTI)
- 运行时类型识别(RTTI)与动态类型转换原理(reinterpret_cast const_cast static_cast dynamic_cast)