Acceso a la información de clases en tiempo de ejecución

En este artículo se explica cómo acceder a información sobre la clase de un objeto en tiempo de ejecución.

Nota:

MFC no usa la compatibilidad con la Información de tipos en tiempo de ejecución (RTTI) incorporada en Visual C++ 4.0.

Si ha derivado la clase de CObject y ha usado DECLARE_DYNAMIC e IMPLEMENT_DYNAMIC; DECLARE_DYNCREATE e IMPLEMENT_DYNCREATE; y las macros DECLARE_SERIAL e IMPLEMENT_SERIAL que se explican en el artículo Derivación de una clase de CObject, la clase CObject tiene la capacidad de determinar la clase exacta de un objeto en tiempo de ejecución.

Esta capacidad resulta más útil cuando se necesita comprobación de tipos adicional de argumentos de función y cuando se debe escribir código de propósito especial basado en la clase de un objeto. Pero esta práctica no suele recomendarse porque duplica la funcionalidad de las funciones virtuales.

La función miembro de CObject IsKindOf se puede usar para determinar si un objeto determinado pertenece a una clase especificada o si se deriva de una clase específica. El argumento de IsKindOf es un objeto CRuntimeClass que se puede obtener mediante la macro RUNTIME_CLASS con el nombre de la clase.

Para usar la macro RUNTIME_CLASS

  1. Use RUNTIME_CLASS con el nombre de la clase, como se muestra aquí para la clase CObject:

    CRuntimeClass *pClass = RUNTIME_CLASS(CObject);
    

Rara vez es necesario acceder directamente al objeto de clase en tiempo de ejecución. Un uso más común es pasar el objeto de clase en tiempo de ejecución a la función IsKindOf, como se muestra en el procedimiento siguiente. La función IsKindOf prueba un objeto para ver si pertenece a una clase determinada.

Para usar la función IsKindOf

  1. Asegúrese de que la clase tiene compatibilidad con las clases en tiempo de ejecución. Es decir, la clase debe haberse derivado directa o indirectamente de CObject y haber usado DECLARE_DYNAMIC e IMPLEMENT_DYNAMIC; DECLARE_DYNCREATE e IMPLEMENT_DYNCREATE; o las macros DECLARE_SERIAL e IMPLEMENT_SERIAL que se explican en el artículo Derivación de una clase de CObject.

  2. Llame a la función miembro IsKindOf de los objetos de esa clase mediante la macro RUNTIME_CLASS para generar el argumento CRuntimeClass, como se muestra aquí:

    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;
    }
    

    Nota:

    IsKindOf devuelve TRUE si el objeto es miembro de la clase especificada o de una clase derivada de la clase especificada. IsKindOf no admite herencia múltiple ni clases base virtuales, aunque puede usar la herencia múltiple con las clases derivadas de Microsoft Foundation, si fuera necesario.

Un uso de la información de clases en tiempo de ejecución es la creación dinámica de objetos. Este proceso se trata en el artículo Creación de objetos dinámicos.

Para obtener información más detallada sobre la serialización y la información de clases en tiempo de ejecución, vea los artículos Archivos en MFC y Serialización.

Consulte también

Uso de CObject