Acessando classe em time de execução informações
Este artigo explica como acessar as informações sobre a classe de um objeto em time de execução.
Observação: |
---|
MFC não usa o Informações sobre o tipo de time de execução (RTTI) suporte introduzido no Visual C++ 4.0. |
Se você tiver derivado sua classe de CObject e usado o DECLARAR_DINÂMICO and IMPLEMENT_DYNAMIC, o DECLARE_DYNCREATE e IMPLEMENT_DYNCREATE, ou o DECLARE_SERIAL e IMPLEMENT_SERIAL macros explicadas no artigo Derivando uma classe de CObject, o CObject classe tem a capacidade de determinar a classe exata de um objeto em time de execução.
Essa capacidade é mais útil quando houver necessidade de tipo extra de verificação de argumentos de função e quando você deve escrever código de finalidade especial com base na classe de um objeto.No entanto, essa prática não é normalmente recomendada porque ele reproduz a funcionalidade de funções virtual.
The 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 para 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, conforme mostrado a seguir para a classe CObject:
CRuntimeClass* pClass = RUNTIME_CLASS( CObject );
Você raramente precisará acessar o em time de execução diretamente o objeto de classe.Um uso mais comum é passar o em time de execução objeto de classe para o IsKindOf função, sistema autônomo mostrado no próximo procedimento. The IsKindOf função testa um objeto para ver se ele pertence a uma determinada classe.
Para usar a função IsKindOf
Certifique-se de que a classe tenha em time de execução suporte de classe.Ou seja, a classe deve ter foi derivada direta ou indiretamente de CObject e usado o DECLARAR_DINÂMICO and IMPLEMENT_DYNAMIC, o DECLARE_DYNCREATE e IMPLEMENT_DYNCREATE, ou o DECLARE_SERIAL e IMPLEMENT_SERIAL macros explicadas no artigo Derivando uma classe de CObject.
telefonar the IsKindOf função de membro para objetos dessa classe, usando o RUNTIME_CLASS macro para gerar o CRuntimeClass argumento, sistema autônomo 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.IsKindOf não suporta vários herança ou classes base virtual, embora você possa usar herança múltipla para suas classes derivadas de Microsoft Foundation se necessário.
Um uso em time de execução classe informações estão na criação de objetos dinâmica.Este processo é abordado no artigo Criar objeto dinâmico.
Para obter informações mais detalhadas sobre a serialização e informações de classe de time de execução, consulte os artigos Arquivos no MFC and Serialização.