Accès aux informations de classe d'exécution
Cet article explique comment accéder aux informations sur la classe d'un objet au moment de l'exécution.
Remarque
MFC n’utilise pas la prise en charge RTTI (Run-Time Type Information ) introduite dans Visual C++ 4.0.
Si vous avez dérivé votre classe de CObject et utilisé declare_DYNAMIC etIMPLEMENT_DYNAMIC
, ou DECLARE_DYNCREATE
IMPLEMENT_DYNCREATE
les DECLARE_SERIAL
macros et les macros IMPLEMENT_SERIAL
expliquées dans l’article Dérivant une classe de CObject, la CObject
classe a la possibilité de déterminer la classe exacte d’un objet au moment de l’exécution.
Cette option est très pratique lorsqu'une vérification de type supplémentaire des arguments de 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 fonction membre CObject
IsKindOf
peut permettre de 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 pour 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 classeCObject
: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
l’élément DECLARE_DYNAMIC etIMPLEMENT_DYNAMIC
,DECLARE_DYNCREATE
IMPLEMENT_DYNCREATE
ou desDECLARE_SERIAL
macrosIMPLEMENT_SERIAL
expliquées dans l’article Dérivant une classe de CObject.Appelez la méthode
IsKindOf
pour les objets de cette classe, à l’aide de la macroRUNTIME_CLASS
pour générer l’argumentCRuntimeClass
, 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; }
Remarque
IsKindOf retourne TRUE si l’objet est 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 abordé dans l’article Création d’objets dynamiques.
Pour plus d’informations sur la sérialisation et les informations de classe d’exécution, consultez les articles Fichiers dans MFC et Sérialisation.