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
Use
RUNTIME_CLASS
con el nombre de la clase, como se muestra aquí para la claseCObject
: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
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 eIMPLEMENT_DYNAMIC
;DECLARE_DYNCREATE
eIMPLEMENT_DYNCREATE
; o las macrosDECLARE_SERIAL
eIMPLEMENT_SERIAL
que se explican en el artículo Derivación de una clase de CObject.Llame a la función miembro
IsKindOf
de los objetos de esa clase mediante la macroRUNTIME_CLASS
para generar el argumentoCRuntimeClass
, 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.