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 usa il supporto RTTI (Run-Time Type Information ) introdotto in Visual C++ 4.0.

Se è stata derivata la classe da CObject e sono state usate le macro DECLARE_DYNAMIC e IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE e IMPLEMENT_DYNCREATEo e DECLARE_SERIAL IMPLEMENT_SERIAL illustrate nell'articolo Derivazione di una classe da CObject, la CObject classe ha la possibilità di determinare la classe esatta di un oggetto in fase di esecuzione.

Questa capacità è molto utile quando è necessario un controllo di tipo aggiuntivo degli argomenti di funzione e quando è necessario scrivere codice per scopi specifici in base alla classe di un oggetto. Tuttavia questa operazione in genere non è consigliata in quanto duplica la funzionalità delle funzioni virtuali.

La funzione membro CObject di IsKindOf 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

  1. 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 a 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 stata derivata direttamente o indirettamente da CObject e ha usato DECLARE_DYNAMIC e IMPLEMENT_DYNAMIC, le DECLARE_DYNCREATE macro e IMPLEMENT_DYNCREATEo DECLARE_SERIAL e IMPLEMENT_SERIAL illustrate nell'articolo Derivazione di una classe da CObject.

  2. Chiamare la funzione membro IsKindOf per gli oggetti della classe, utilizzando la macro RUNTIME_CLASS per generare l'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 le classi base virtuali, sebbene, se necessario, sia possibile utilizzare l'ereditarietà multipla per le classi derivate di Microsoft Foundation.

Un utilizzo delle informazioni sulla classe di runtime è la creazione dinamica di oggetti. Questo processo è illustrato nell'articolo Creazione di oggetti dinamici.

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

Vedi anche

Uso di CObject