访问运行时选件类信息
本文演示如何有关对象的类访问有关运行时。
说明 |
---|
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) 如果需要,使用多重继承。
对运行时类信息的对象使用的动态创建。这篇文章 动态对象创建处理讨论。
有关序列化和运行时类信息的更多详细信息,请参见位于 MFC 中的文件 和 序列化。