Información de acceso de la clase en tiempo de ejecución
En este artículo se explica cómo obtener acceso a información de clase de un objeto en tiempo de ejecución.
[!NOTA]
MFC no utiliza la compatibilidad de Información en tiempo de ejecución (RTTI) introducido en Visual C++ 4,0.
Si tiene derivado la clase de CObject y utilizó _DYNAMIC y IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE y IMPLEMENT_DYNCREATEde DECLARE, o macros de DECLARE_SERIAL y de IMPLEMENT_SERIAL explicadas en el caso Derivar de una clase de CObject, la clase de CObject tiene la capacidad de determinar la clase exacta de un objeto en tiempo de ejecución.
Esta capacidad es más útil cuando la comprobación de tipo adicional de los argumentos de la función es necesaria y cuando debe escribir el código especial basado en la clase de un objeto.Sin embargo, este procedimiento no suele ser recomendable porque duplica la funcionalidad de funciones virtuales.
La función IsKindOf miembro de CObject se puede utilizar para determinar si un determinado objeto pertenece a una clase especificada o si es derivado de una clase concreta.El argumento en IsKindOf es un objeto de CRuntimeClass , que se puede obtener mediante la macro de RUNTIME_CLASS con el nombre de clase.
Para utilizar la macro de RUNTIME_CLASS
Utilice RUNTIME_CLASS con el nombre de clase, como se muestra aquí para la clase CObject:
CRuntimeClass* pClass = RUNTIME_CLASS( CObject );
Necesitará raramente tener acceso a la clase en tiempo de ejecución directamente.Un uso común es pasar el objeto de clase en tiempo de ejecución a la función de IsKindOf , como se muestra en el procedimiento siguiente.Las pruebas de función de IsKindOf un objeto para ver si pertenece a una clase determinada.
Para utilizar la función IsKindOf
Asegúrese de que la clase tenga compatibilidad con la clase en tiempo de ejecución.Es decir, la clase debe haberse derivada directa o indirectamente de CObject y utilizó _DYNAMIC y IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE y IMPLEMENT_DYNCREATEde DECLARE, o macros de DECLARE_SERIAL y de IMPLEMENT_SERIAL explicadas en el caso Derivar de una clase de CObject.
Llame a la función miembro de IsKindOf para los objetos de esa clase, mediante la macro de RUNTIME_CLASS para generar el argumento de 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 un miembro de la clase especificada o de una clase derivada de la clase especificada.IsKindOf no admite la herencia múltiple o clases base virtuales, aunque puede utilizar la herencia múltiple para sus clases derivadas de la Microsoft foundation class en caso necesario.
Un uso de la información de la clase en tiempo de ejecución está en la creación dinámica de objetos.Este proceso se describe en el artículo Creación de objetos dinámica.
Para obtener información más detallada sobre la serialización y la clase en tiempo de ejecución, vea los artículos archivos en MFC y serialización.