访问运行时选件类信息

本文演示如何有关对象的类访问有关运行时。

备注

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

如果从 CObject 在该文章 派生类从 CObject上派生了类并使用了 DECLARE_DYNAMICIMPLEMENT_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_DYNAMICIMPLEMENT_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) 如果需要,使用多重继承。

对运行时类信息的对象使用的动态创建。 这篇文章 动态对象创建处理讨论。

有关序列化和运行时类信息的更多详细信息,请参见位于 MFC 中的文件序列化

请参见

概念

使用CObject