RTTI运行时类型识别与类对象的动态创建.doc

RTTI运行时类型识别与类对象的动态创建.doc

ID:59252764

大小:150.50 KB

页数:9页

时间:2020-09-08

RTTI运行时类型识别与类对象的动态创建.doc_第1页
RTTI运行时类型识别与类对象的动态创建.doc_第2页
RTTI运行时类型识别与类对象的动态创建.doc_第3页
RTTI运行时类型识别与类对象的动态创建.doc_第4页
RTTI运行时类型识别与类对象的动态创建.doc_第5页
资源描述:

《RTTI运行时类型识别与类对象的动态创建.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、RTTI运行时类型识别CRuntimeClass是MFC专用的。CRuntimeClass在文件AFX.H中声明,它是用来串起MFC从COBJECT继承下来的所有类。也可以把自己写的类加入这个链表。structCRuntimeClass{//AttributesLPCSTRm_lpszClassName;//类名intm_nObjectSize;//类对象大小UINTm_wSchema;//分类编号(对不可分类的类,该值为-1)CObject*(PASCAL*m_pfnCreateObject)();/

2、/NULL=>abstractclassCRuntimeClass*m_pBaseClass;//基类指针,但这里指针一定是指向父亲的,而不会指向祖父//CRuntimeClassobjectslinkedtogetherinsimpleliststaticCRuntimeClass*pFirstClass;//classlist的链表头。注意这个与基类指针不同。并且,该对象是个静态变量,所有CRuntimeClass对象共享CRuntimeClass*m_pNextClass;//链表中紧跟当前对象的

3、下一个对象。与当前对象不一定有继承关系};特别注意:该struct使用了链表的概念,但是该链表与常规的数据结构链表是不太一样的。该链表每次新加入的节点都是放在链表头上的,类似栈。所以pFirstClass是随着每次新节点的加入一直在更新的,pFirstClass必然指向新加入的节点。而m_pNextClass则指向前一个加入的节点。如下图:首先初始化staticCRuntimeClass*pFirstClass为NULL。①最开始加入链表的是CObject。此时:在_IMPLEMENT_RUNTIMEC

4、LASS宏中先直接设置m_pBaseClass:#m_pBaseClass=NULL;然后在_IMPLEMENT_RUNTIMECLASS宏中调用AFX_CLASSINIT的构造函数设置m_pNextClass与pFirstClass:(这两者是先m_pNextClass后pFirstClass)#m_pNextClass=pFirstClass=NULL;#pFirstClass=CObject;②然后CCmdTarget加入链表。数据更新顺序同上:#m_pBaseClass=CObject;#m_p

5、NextClass=pFirstClass=CObject;#pFirstClass=CCmdTarget;③接着CWinThread加入链表。数据更新顺序同上:#m_pBaseClass=CCmdTarget;#m_pNextClass=pFirstClass=CCmdTarget;#pFirstClass=CWinThread;每一个类都拥有这样一个static的CRuntimeClass成员变量。由于每个类都有static的CRuntimeClass成员变量,所以每个类的对象都是引用以及修改本类的

6、static的CRuntimeClass成员变量,而不会将父类或者子类的修改掉。(父类与子类中的static同名成员变量是会造成“覆盖”的,该覆盖指的是引用时若不加域名直接使用,则使用的是本类的,而不会引用父类的。但实际上在内存中父类的static同名成员变量是依然存在的)每个static的CRuntimeClass成员变量都有一定的命名规则(在CRuntimeClass中采用的方法是在每个类的类名之前冠以"class"作为它的名称,如CView的名称为classCView),然后,经由某种手段将整个类

7、别库构造好之后,「类别型录」能呈现类似这样的风貌:注意是每个类共享一个CRuntimeClass成员变量。例:CCmdTargetcmd1,cmd2;CWinThreadthread;上面两个类定义了三个对象。其中:①cmd1与cmd2共享一个CRuntimeClass成员变量。所以cmd1与cmd2所拥有的CRuntimeClass成员变量是同一个。②thread单独使用一个CRuntimeClass成员变量。thread所使用的这个CRuntimeClass成员变量与cmd1、cmd2共享的那个CR

8、untimeClass成员变量不是同一个。③pFirstClass是CRuntimeClass结构体中的static变量,所以所有的对象都共享pFirstClass。因此,cmd1、cmd2、thread三者共享CRuntimeClass结构体中的static变量pFirstClass。对于CView,其CView.hclassCView:publicCWnd{DECLARE_DYNAMIC(CView)}CView.cppIMPLEMEN

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。