Acessando informações da classe runtime
Este artigo explica como acessar em tempo de execução informações sobre a classe de um objeto.
Dica
MFC O não usa o suporte de Informações de tipo de tempo de execução () RTTI introduzido no Visual C++ 4.0.
Se você derivadas a sua classe de CObject e usou o _DYNAMIC e IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE e IMPLEMENT_DYNCREATEde DECLARE, ou macros de DECLARE_SERIAL e de IMPLEMENT_SERIAL explicados no artigo Com uma classe de CObject, a classe de CObject tem a capacidade de determinar em tempo de execução a classe precisa de um objeto.
Essa capacidade é mais útil quando a verificação de tipo adicional de argumentos de função é necessária e quando você deve escrever o código do objetivo especial com base na classe de um objeto. No entanto, essa prática recomendada é normalmente porque não duplica a funcionalidade de funções virtuais.
A função de membro IsKindOf de CObject pode ser usada para determinar se um determinado objeto pertence a uma classe especificada ou se é derivado de uma classe específica. O argumento para IsKindOf é um objeto de CRuntimeClass , que você pode obter com a macro de RUNTIME_CLASS com o nome da classe.
Para usar a macro de RUNTIME_CLASS
Use RUNTIME_CLASS com o nome da classe, conforme mostrado aqui para a classe CObject:
CRuntimeClass* pClass = RUNTIME_CLASS( CObject );
Você precisará raramente de acessar diretamente o objeto da classe de tempo de execução. Uso mais comum é passe o objeto da classe de tempo de execução à função de IsKindOf , conforme mostrado no procedimento a seguir. Testes de função de IsKindOf um objeto para verificar se pertence a uma classe específica.
Para usar a função de IsKindOf
Verifique a classe que tem o suporte da classe de tempo de execução. Isto é, a classe deve ter sido derivada direta ou indiretamente de CObject e usou o _DYNAMIC e IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE e IMPLEMENT_DYNCREATEde DECLARE, ou macros de DECLARE_SERIAL e de IMPLEMENT_SERIAL explicados no artigo Com uma classe de CObject.
Chame a função de membro de IsKindOf para objetos dessa classe, usando a macro de RUNTIME_CLASS para gerar o argumento de CRuntimeClass , como mostrado a seguir:
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; }
Dica
IsKindOf retorna Verdadeiro se o objeto for um membro da classe especificada ou de uma classe derivada da classe especificada.IsKindOf não da suporte a herança múltipla ou classes base virtuais, embora você possa usar a herança múltipla para suas classes derivadas do Microsoft se necessário.
Um uso de informações da classe de tempo de execução estiver em criação dinâmico de objetos. Esse processo é discutido no artigo Criação do objeto dinâmico.
Para obter informações mais detalhadas sobre a serialização e de informações da classe de tempo de execução, consulte os artigos Arquivos em MFC e Serialização.