Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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 Run-Time Type Information (RTTI) introduite dans Visual C++ 4.0.
Si vous avez dérivé votre classe de CObject et utilisé les macros DECLARE_DYNAMIC et IMPLEMENT_DYNAMIC, les DECLARE_DYNCREATE et IMPLEMENT_DYNCREATE, ou les DECLARE_SERIAL et IMPLEMENT_SERIAL expliquées dans l’article Dériver une classe de CObject, la CObject classe a la capacité de déterminer la classe exacte d’un objet à l'exécution.
Cette capacité est la plus utile lorsque la vérification de type supplémentaire des arguments de fonction est nécessaire et lorsque vous devez écrire du code à usage spécial en fonction de la classe d’un objet. Toutefois, cette pratique n’est généralement pas recommandée, car elle duplique les fonctionnalités des fonctions virtuelles.
La CObject fonction IsKindOf membre peut être utilisée pour déterminer si un objet particulier appartient à une classe spécifiée ou s’il est dérivé d’une classe spécifique. L'argument de IsKindOf est un objet CRuntimeClass, que vous pouvez obtenir en utilisant la macro RUNTIME_CLASS avec le nom de la classe.
Pour utiliser la macro RUNTIME_CLASS
Utilisez
RUNTIME_CLASSle nom de la classe, comme indiqué ici pour la classeCObject:CRuntimeClass *pClass = RUNTIME_CLASS(CObject);
Vous devrez rarement accéder directement à l’objet de classe d’exécution. Une utilisation plus courante consiste à passer l’objet de classe d’exécution à la IsKindOf fonction, comme indiqué dans la procédure suivante. La IsKindOf fonction teste un objet pour voir s’il appartient à une classe particulière.
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
CObjectet utilisé les macros DECLARE_DYNAMIC etIMPLEMENT_DYNAMIC, lesDECLARE_DYNCREATEetIMPLEMENT_DYNCREATE, ou lesDECLARE_SERIALetIMPLEMENT_SERIALexpliquées dans l’article Dériver une classe de CObject.Appelez la
IsKindOffonction membre pour les objets de cette classe, à l’aide de laRUNTIME_CLASSmacro pour générer l’argumentCRuntimeClass, comme illustré 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.
IsKindOfne prend pas en charge plusieurs classes d’héritage ou de base virtuelle, bien que vous puissiez utiliser plusieurs héritages pour vos classes Microsoft Foundation dérivées si nécessaire.
L’une des informations de classe d’exécution est utilisée dans la création dynamique d’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.