Partager via


Les informations sur la classe à l'exécution d'accès

Cet article explique pour accéder aux informations relatives à la classe d'un objet au moment de l'exécution.

[!REMARQUE]

MFC n'utilise pas la prise en charge de Run aller-retour Type Information (RTTI) introduite dans Visual C++ 4,0.

Si vous avez dérivé votre classe de CObject et d'utiliser _de DECLAREDYNAMIQUE et IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE et IMPLEMENT_DYNCREATE, la macro ou d' DECLARE_SERIAL et d' IMPLEMENT_SERIAL expliquées dans l'article dérivation d'une classe de CObject, la classe d' CObject a la capacité de déterminer la classe exacte d'un objet au moment de l'exécution.

Cette possibilité est très utile lorsque la vérification de type supplémentaire des arguments de fonction est nécessaire et lorsque vous devez écrire du code pour un objectif particulier selon la classe d'un objet.Toutefois, cette pratique est en général pas recommandée car elle duplique la fonctionnalité des fonctions virtuelles.

La fonction membre IsKindOf d' CObject 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 en IsKindOf est un objet d' CRuntimeClass , que vous pouvez obtenir en utilisant la macro d' RUNTIME_CLASS avec le nom de la classe.

Pour utiliser la macro de RUNTIME_CLASS

  • Utilisez RUNTIME_CLASS avec le nom de la classe, comme indiqué ici pour la classe CObject:

    CRuntimeClass* pClass = RUNTIME_CLASS( CObject );   
    

Vous devez rarement accéder à l'objet de classe d'exécution directement.Une utilisation plus courant consiste à passer l'objet de classe d'exécution à la fonction d' IsKindOf , comme indiqué dans la procédure suivante.Les tests de fonction d' IsKindOf un objet pour voir s'il appartient à une classe particulière.

Pour utiliser la fonction d'IsKindOf

  1. Assurez -vous que la classe possède une prise en charge de classe d'exécution.Autrement dit, la classe doit avoir été dérivée directement ou indirectement d' CObject et a utilisé le _ DECLAREDYNAMIQUE et IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE et IMPLEMENT_DYNCREATE, la macro ou d' DECLARE_SERIAL et d' IMPLEMENT_SERIAL expliquées dans l'article dérivation d'une classe de CObject.

  2. Appelez la fonction membre d' IsKindOf pour les objets de cette classe, en utilisant la macro d' RUNTIME_CLASS pour générer l'argument d' CRuntimeClass , comme indiqué ci-après :

    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 virtuelle, bien que vous puissiez utiliser l'héritage multiple pour vos classes dérivées de Microsoft Foundation si nécessaire.

Une utilisation plus d'informations sur la classe à l'exécution est dans la création dynamique d'objets.Ce processus est décrite dans l'article création d'objet dynamique.

Pour des informations détaillées sur la sérialisation et les informations sur la classe à l'exécution, consultez les articles fichiers dans MFC et sérialisation.

Voir aussi

Concepts

À l'aide de CObject