访问运行时类信息

本文说明运行时如何访问有关对象的类的信息。

备注

MFC不使用 在 Visual C++ 4.0 中引入的 运行时类型信息 (RTTI) 支持。

如果已从 CObject 中的文章 从派生类 CObject派生的类并使用 DECLARE_DYNAMIC 以及 IMPLEMENT_DYNAMICDECLARE_DYNCREATEIMPLEMENT_DYNCREATE也说明了 DECLARE_SERIALIMPLEMENT_SERIAL 宏,CObject 类能够确定对象的具体类在运行时。

此功能当函数参数附加类型检查需要时非常有用,并且,当必须编写基于对象的专用类中的代码。 但是,此做法,因为它复制虚拟函数的功能,通常建议不要使用。

CObject 成员函数 IsKindOf 可用于确定特定对象是否属于指定它是特定的类或从类派生。 IsKindOf 的参数是一个 CRuntimeClass 对象,您可以获取使用的类名的 RUNTIME_CLASS 宏。

使用 RUNTIME_CLASS 宏

  • 使用类名的 RUNTIME_CLASS,此处显示的 CObject类:

    CRuntimeClass* pClass = RUNTIME_CLASS( CObject );   
    

基本上不需要直接访问运行时类对象。 更通常是传递给 IsKindOf 函数运行时类对象,如下面的过程所示。 IsKindOf 函数测试一个对象来确定它是否属于特定类。

使用 IsKindOf 函数

  1. 确定类具有运行时类支持。 即在文章 从派生类 CObject必须直接或间接从 CObject 派生了类并使用 DECLARE_DYNAMIC 以及 IMPLEMENT_DYNAMICDECLARE_DYNCREATEIMPLEMENT_DYNCREATE、解释的 DECLARE_SERIALIMPLEMENT_SERIAL 宏。

  2. 调用该类对象的 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 返回 TRUEIsKindOf 不支持多或虚拟继承的基类版本,不过,可以对派生的 Microsoft 基础类 (MFC) 如果需要,使用多重继承。

使用运行时类信息的可在对象的动态创建。 此进程在文章 动态对象创建中讨论。

有关序列化并运行 TIME 类信息的更详细信息,请参见和文章 MFC 中的文件 序列化

请参见

概念

使用 CObject