MFC教程(3)-- CObject类
2010-03-25 20:33:52 来源:WEB开发网RUNTIME_CLASS宏
RUNTIME_CLASS宏定义如下:
#define RUNTIME_CLASS(class_name) (&class_name::class##class_name)
为了方便地得到每个类(Cobject或其派生类)的CRuntimeClass类型的静态成员变量,MFC定义了这个宏。它返回对类class_name的CRuntimeClass类型成员变量的引用,该成员变量的名称是“class”加上class_name(类的名字)。例如:
RUNTIME_CLASS(CObject)得到对classCObject的引用;
RUNTIME_CLASS(CPerson)得到对class CPerson的引用。
动态类信息、动态创建的原理
MFC对Cobject动态类信息、动态创建的实现原理:
动态类信息、动态创建都建立在给类添加的CRuntimeClass类型的静态成员变量基础上,总结如下。
C++不支持动态创建,但是支持动态对象的创建。动态创建归根到底是创建动态对象,因为从一个类名创建一个该类的实例最终是创建一个以该类为类型的动态对象。其中的关键是从一个类名可以得到创建其动态对象的代码。
在一个类没有任何实例之前,怎么可以得到该类的创建动态对象的代码?借助于C++的静态成员数据技术可达到这个目的:
静态成员数据在程序的入口(main或WinMain)之前初始化。因此,在一个静态成员数据里存放有关类型信息、动态创建函数等,需要的时候,得到这个成员数据就可以了。
不论一个类创建多少实例,静态成员数据只有一份。所有的类的实例共享一个静态成员数据,要判断一个类是否是一个类的实例,只须确认它是否使用了该类的这个静态数据。
从前两节的讨论知道,DECLARE_CREATE等宏定义了一个这样的静态成员变量:类型是CRuntimeClass,命名约定是“calss”加上类名;IMPLEMENT_CREATE等宏初始化该变量;RUNTIME_CLASS宏用来得到该成员变量。
动态类信息的原理在分析CRuntimeClass的成员函数IsDerivedFrom时已经作了解释。
动态创建的过程和原理了,用图表示其过程如下:
更多精彩
赞助商链接