Les informations sur la classe au moment de l'exécution d'accès
Cet article explique comment accéder aux informations sur la classe d'un objet au moment de l'exécution.
Notes
MFC n'utilise pas la prise en charge de Run-Time Type Information (RTTI) introduite dans Visual C++ 4.0.
Si vous avez dérivé votre classe de CObject et avez utilisé DECLARE_DYNAMIC et IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE et IMPLEMENT_DYNCREATE, ou les macros DECLARE_SERIAL et IMPLEMENT_SERIAL expliquées dans l'article Dérivation d'une classe de CObject, la classe CObject est capable de déterminer la classe spécifique d'un objet au moment de l'exécution.
Cette possibilité est très utile lorsqu'une vérification supplémentaire des types des arguments de la fonction est nécessaire et lorsque vous devez écrire un code spécial en fonction de la classe d'un autre objet. Toutefois, cette pratique n'est généralement pas recommandée car elle duplique les fonctionnalités des fonctions virtuelles.
La méthode IsKindOf de CObject peut être utilisée pour déterminer si un objet particulier appartient à une classe spécifiée ou si elle est dérivée d'une classe spécifique. L'argument de IsKindOf est un objet CRuntimeClass, que vous pouvez obtenir à l'aide de la macro RUNTIME_CLASS avec le nom de la classe.
Pour utiliser la macro RUNTIME_CLASS
Utilisez RUNTIME_CLASS avec le nom de la classe, comme indiqué ici pour la classe CObject:
CRuntimeClass* pClass = RUNTIME_CLASS( CObject );
Vous devrez rarement accéder à l'objet de classe d'exécution directement. Un usage plus courant consiste à passer l'objet de classe d'exécution à la fonction IsKindOf, comme le montre la procédure suivante. La fonction IsKindOf teste un objet pour voir s'il appartient à une classe donnée.
Pour utiliser la fonction IsKindOf
Vérifiez que la classe possède la prise en charge de la classe d'exécution. Autrement dit, la classe doit avoir été dérivée directement ou indirectement de CObject et utilisé DECLARE_DYNAMIC et IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE et IMPLEMENT_DYNCREATE, ou les macros DECLARE_SERIAL et IMPLEMENT_SERIAL expliquées dans l'article Dérivation d'une classe de CObject.
Appelez la méthode IsKindOf pour les objets de cette classe, à l'aide de la macro RUNTIME_CLASS pour générer l'argument CRuntimeClass, comme indiqué ici :
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; }
Notes
IsKindOf retourne TRUE si l'objet est un membre de la classe spécifiée ou d'une classe dérivée de la classe spécifiée.IsKindOf ne prend pas en charge l'héritage multiple ou les classes de base virtuelles, bien que vous puissiez utiliser l'héritage multiple pour vos classes dérivées Microsoft Foundation si nécessaire.
Une utilisation des informations sur la classe d'exécution est en création dynamique des objets. Ce processus est traité dans l'article Création d'objet dynamique.
Pour plus d'informations détaillées sur la sérialisation et les informations de classe d'exécution, consultez les articles Fichiers de MFC et Sérialisation.