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

  1. Utilisez RUNTIME_CLASS le nom de la classe, comme indiqué ici pour la classe CObject:

    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

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

  2. Appelez la IsKindOf fonction membre pour les objets de cette classe, à l’aide de la RUNTIME_CLASS macro pour générer l’argument CRuntimeClass , 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. IsKindOf ne 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.

Voir aussi

Utilisation de CObject