Partager via


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_DYNCREATEles 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 CObjectIsKindOf 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

  1. 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

  1. 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 et IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE IMPLEMENT_DYNCREATEou des DECLARE_SERIAL macros IMPLEMENT_SERIAL expliquées dans l’article Dérivant une classe de CObject.

  2. 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;
    }
    

    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.

Voir aussi

Utilisation de CObject