Accedere a informazioni sulla classe di runtime
In questo articolo viene illustrato come accedere alle informazioni sulla classe di oggetto in fase di esecuzione.
[!NOTA]
MFC non utilizza il supporto di Informazioni sui tipi di runtime RTTI () introdotto in Visual C++ 4,0.
Se si deriva una classe da CObject e utilizzato _DYNAMIC e IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE e IMPLEMENT_DYNCREATEdi DECLARE, o le macro di IMPLEMENT_SERIAL e di DECLARE_SERIAL illustrate nell'articolo Derivando una classe da CObject, la classe di CObject consente di determinare la classe esatta di un oggetto in fase di esecuzione.
Questa possibilità è molto utile quando il controllo di tipo aggiuntivo degli argomenti della funzione è necessario e quando è necessario scrivere codice specifico in base alla classe di oggetto.Tuttavia, questa operazione non è in genere consigliabile perché possa duplicare 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 in IsKindOf è un oggetto di CRuntimeClass , ottenibile utilizzando la macro di RUNTIME_CLASS con il nome della classe.
Per utilizzare la macro di RUNTIME_CLASS
Utilizzare RUNTIME_CLASS con il nome della classe, come illustrato di seguito per la classe CObject:
CRuntimeClass* pClass = RUNTIME_CLASS( CObject );
Sarà necessario raramente accedere direttamente a un oggetto di classe di runtime.Un altro utilizzo comune consiste nel passare l'oggetto della classe di runtime alla funzione di IsKindOf , come illustrato nella procedura descritta di seguito.La funzione testa di IsKindOf un oggetto per verificare se appartiene a una classe particolare.
Per utilizzare la funzione di IsKindOf
Verificare che la classe di supporto della classe di runtime.Ovvero la classe deve essere derivata direttamente o indirettamente da CObject e ha eseguito _DYNAMIC e IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE e IMPLEMENT_DYNCREATEdi DECLARE, o le macro di IMPLEMENT_SERIAL e di DECLARE_SERIAL illustrate nell'articolo Derivando una classe da CObject.
Chiamare la funzione membro di IsKindOf per gli oggetti della classe, utilizzando la macro di RUNTIME_CLASS per generare l'argomento di 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 Microsoft Foundation se necessario.
Un utilizzo di informazioni sulla classe di runtime consiste nella creazione dinamica di oggetti.Questo processo viene illustrato nell'articolo creazione di un oggetto dinamica.
Per informazioni più dettagliate sulla serializzazione e le informazioni sulla classe di runtime, vedere gli articoli file in MFC e serializzazione.