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_DYNCREATE
o 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
Utilizzare
RUNTIME_CLASS
con il nome della classe, come illustrato di seguito per la classeCObject
: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
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 eIMPLEMENT_DYNAMIC
, leDECLARE_DYNCREATE
macro eIMPLEMENT_DYNCREATE
oDECLARE_SERIAL
eIMPLEMENT_SERIAL
illustrate nell'articolo Derivazione di una classe da CObject.Chiamare la funzione membro
IsKindOf
per gli oggetti della classe, utilizzando la macroRUNTIME_CLASS
per generare l'argomentoCRuntimeClass
, 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.