Compartir a través de


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

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

Nota:

MFC no utiliza la información de tipoRun-Time (RTTI) introducida en Visual C++ 4.0.

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

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

La CObject función IsKindOf miembro 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 para IsKindOf es un CRuntimeClass objeto , que puede obtener mediante la RUNTIME_CLASS macro 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);
    

Usted rara vez necesitará acceder al objeto de clase en tiempo de ejecución directamente. Un uso más común es pasar el objeto de clase en tiempo de ejecución a la IsKindOf función, como se muestra en el procedimiento siguiente. La IsKindOf función 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 clases en tiempo de ejecución. Es decir, la clase debe haberse derivado directa o indirectamente de CObject y haber usado DECLARE_DYNAMIC y IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE, o las macros IMPLEMENT_DYNCREATE y DECLARE_SERIAL que se explican en el artículo IMPLEMENT_SERIAL.

  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 o clases base virtuales, aunque puede usar herencia múltiple para las clases derivadas de Microsoft Foundation si es necesario.

Un uso de la información de clase en tiempo de ejecución se encuentra en la creación dinámica de objetos. Este proceso se describe en el artículo Creación dinámica de objetos.

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

Consulte también

Uso de CObject