Condividi tramite


Accesso alle informazioni sulle classi di runtime

In questo articolo viene illustrato come accedere alle informazioni sulla classe di un oggetto in fase di esecuzione.

Nota

MFC non utilizza il supporto Informazioni sui tipi in fase di esecuzione (RTTI) introdotto in Visual C++ 4.0.

Se la classe è stata derivata da CObject e si è fatto utilizzo delle macro DECLARE_DYNAMIC e IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE e IMPLEMENT_DYNCREATE, o DECLARE_SERIAL e IMPLEMENT_SERIAL illustrate nell'articolo Derivare una classe da CObject, la classe CObject è in grado di determinare la classe esatta di un oggetto in fase di esecuzione.

Questa possibilità è molto utile quando è necessario un controllo di tipo aggiuntivo degli argomenti di funzione e quando è necessario scrivere codice specifico in base alla classe di un oggetto. Comunque, questa operazione non è in genere consigliabile in quanto duplica la funzionalità delle funzioni virtuali.

La funzione membro IsKindOf di CObject può essere utilizzata per determinare se un particolare oggetto appartiene a una classe specificata o se è derivato da una classe specifica. L'argomento per IsKindOf è un oggetto CRuntimeClass, che è possibile ottenere utilizzando la macro RUNTIME_CLASS con il nome della classe.

Per utilizzare la macro RUNTIME_CLASS

  • Utilizzare RUNTIME_CLASS con il nome della classe, come illustrato di seguito per la classe CObject:

    CRuntimeClass* pClass = RUNTIME_CLASS( CObject );    
    

Raramente sarà necessario accedere direttamente all'oggetto della classe di runtime. Un altro utilizzo comune consiste nel passare l'oggetto della classe di runtime alla funzione IsKindOf, come illustrato nella procedura seguente. La funzione IsKindOf esegue dei test su un oggetto per vedere se appartiene ad una determinata classe.

Per utilizzare la funzione IsKindOf

  1. Assicurarsi che la classe disponga di supporto alle classi di runtime. Ovvero la classe deve essere derivata direttamente o indirettamente da CObject e devono essere usate le macro DECLARE_DYNAMIC e IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE e IMPLEMENT_DYNCREATE, o DECLARE_SERIAL e IMPLEMENT_SERIAL descritte nell'articolo Derivare una classe da CObject.

  2. Chiamare la funzione membro IsKindOf per gli oggetti della classe, utilizzando la macro RUNTIME_CLASS per la generazione dell'argomento CRuntimeClass, come illustrato di seguito:

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

    Nota

    IsKindOf restituisce TRUE se l'oggetto è un membro della classe specificata o di una classe derivata dalla classe specificata.IsKindOf non supporta l'ereditarietà multipla o classi di base virtuali, sebbene sia possibile utilizzare l'ereditarietà multipla per le classi derivate di Microsoft Foundation se necessario.

Un utilizzo di informazioni sulla classe di runtime è la creazione dinamica di oggetti. Questo processo è descritto nell'articolo Creazione dinamica di un oggetto.

Per informazioni più dettagliate sulla serializzazione e le informazioni sulla classe di runtime, vedere gli articoli File in MFC e Serializzazione.

Vedere anche

Concetti

Utilizzo di CObject