访问运行时类信息
本文说明运行时如何访问有关对象的类的信息。
备注
MFC不使用 在 Visual C++ 4.0 中引入的 运行时类型信息 (RTTI) 支持。
如果已从 CObject 中的文章 从派生类 CObject派生的类并使用 DECLARE_DYNAMIC 以及 IMPLEMENT_DYNAMIC、DECLARE_DYNCREATE 和 IMPLEMENT_DYNCREATE也说明了 DECLARE_SERIAL 和 IMPLEMENT_SERIAL 宏,CObject 类能够确定对象的具体类在运行时。
此功能当函数参数附加类型检查需要时非常有用,并且,当必须编写基于对象的专用类中的代码。 但是,此做法,因为它复制虚拟函数的功能,通常建议不要使用。
CObject 成员函数 IsKindOf 可用于确定特定对象是否属于指定它是特定的类或从类派生。 IsKindOf 的参数是一个 CRuntimeClass 对象,您可以获取使用的类名的 RUNTIME_CLASS 宏。
使用 RUNTIME_CLASS 宏
使用类名的 RUNTIME_CLASS,此处显示的 CObject类:
CRuntimeClass* pClass = RUNTIME_CLASS( CObject );
基本上不需要直接访问运行时类对象。 更通常是传递给 IsKindOf 函数运行时类对象,如下面的过程所示。 IsKindOf 函数测试一个对象来确定它是否属于特定类。
使用 IsKindOf 函数
确定类具有运行时类支持。 即在文章 从派生类 CObject必须直接或间接从 CObject 派生了类并使用 DECLARE_DYNAMIC 以及 IMPLEMENT_DYNAMIC、DECLARE_DYNCREATE 和 IMPLEMENT_DYNCREATE、解释的 DECLARE_SERIAL 和 IMPLEMENT_SERIAL 宏。
调用该类对象的 IsKindOf 成员函数,则使用 RUNTIME_CLASS 宏生成 CRuntimeClass 参数,如下所示:
class CPerson : public CObject { DECLARE_DYNAMIC( CPerson ) // other declarations };
IMPLEMENT_DYNAMIC( CPerson, CObject ) IMPLEMENT_DYNCREATE(CMyDynCreateObj, CObject) void MemoryCorruptingSnippet(bool bCorrupt) { if (bCorrupt) { CAge* pcage = new CAge(21); // CAge is derived from CObject. Age* page = new Age(22); // Age is NOT derived from CObject. *(((char*)pcage) - 1) = 99; // Corrupt preceding guard byte *(((char*)page) - 1) = 99; // Corrupt preceding guard byte AfxCheckMemory(); } } void SomeFunction(void) { CObject* pMyObject = new CPerson; if(NULL != pMyObject && pMyObject->IsKindOf( RUNTIME_CLASS( CPerson ) ) ) { //if IsKindOf is true, then cast is all right CPerson* pmyPerson = (CPerson*) pMyObject ; pmyPerson->AssertValid(); // other code goes here... } delete pMyObject; }
备注
如果对象是指定类的成员是从指定类派生的类,或 IsKindOf 返回 TRUE。IsKindOf 不支持多或虚拟继承的基类版本,不过,可以对派生的 Microsoft 基础类 (MFC) 如果需要,使用多重继承。
使用运行时类信息的可在对象的动态创建。 此进程在文章 动态对象创建中讨论。
有关序列化并运行 TIME 类信息的更详细信息,请参见和文章 MFC 中的文件 序列化。