Acessar informações de classe de tempo de execução
Este artigo explica como acessar informações sobre a classe de um objeto em tempo de execução.
Observação |
---|
MFC não usa o Informações de tipo de tempo de execução suporte (RTTI) introduzido no Visual C++ 4.0. |
Se tiver derivado sua classe de CObject e usado o DECLARE_dinâmico e IMPLEMENT_DYNAMIC, o DECLARE_DYNCREATE e IMPLEMENT_DYNCREATE, ou o DECLARE_SERIAL e IMPLEMENT_SERIAL macros explicado no artigo derivando uma classe de CObject, o CObject classe tem a capacidade de determinar a classe exata de um objeto em tempo de execução.
Essa capacidade é mais útil quando extra tipo de verificação de argumentos de função é necessária e você deve escrever código de finalidade especial com base na classe de um objeto.No entanto, essa prática não é normalmente recomendável porque ele reproduz a funcionalidade de funções virtuais.
O CObject função de membro IsKindOf pode ser usado para determinar se um determinado objeto pertence a uma classe especificada ou se ele é derivado de uma classe específica.O argumento IsKindOf é um CRuntimeClass objeto que você pode obter usando o RUNTIME_CLASS macro com o nome da classe.
Para usar a macro RUNTIME_CLASS
Use RUNTIME_CLASS com o nome da classe, como mostrado aqui para a classe CObject:
CRuntimeClass* pClass = RUNTIME_CLASS( CObject );
Você raramente precisará acessar diretamente o objeto de classe de tempo de execução.Um uso mais comum é passar o objeto de classe de tempo de execução para o IsKindOf função, como mostrado no próximo procedimento.O IsKindOf função testa um objeto para ver se ele pertence a uma determinada classe.
Para usar a função IsKindOf
Verifique se que a classe tem suporte de classe de tempo de execução.Isto é, a classe deve derivada direta ou indiretamente de CObject e usado o DECLARE_dinâmico e IMPLEMENT_DYNAMIC, o DECLARE_DYNCREATE e IMPLEMENT_DYNCREATE, ou o DECLARE_SERIAL e IMPLEMENT_SERIAL macros explicado no artigo derivando uma classe de CObject.
Chamar o IsKindOf função de membro para objetos dessa classe usando o RUNTIME_CLASS macro para gerar a CRuntimeClass argumento, como mostrado aqui:
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; }
Observação IsKindOf retorna TRUE se o objeto for um membro da classe especificada ou de uma classe derivada da classe especificada.IsKindOfnão suporta vários herança ou classes base virtuais, embora você possa usar herança múltipla para os Microsoft Foundation classes derivadas, se necessário.
Um uso de informações de classe de tempo de execução está na criação de objetos dinâmica.Esse processo é discutido no artigo Criação do objeto dinâmico.
Para obter mais informações sobre a serialização e informações de classe de tempo de execução, consulte os artigos arquivos no MFC e serialização.