Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este artigo explica como acessar informações sobre a classe de um objeto em tempo de execução.
Observação
O MFC não usa o suporte de RTTI ( informações de tipoRun-Time ) introduzido no Visual C++ 4.0.
Se você tiver derivado sua classe de CObject e usado o DECLARE_DYNAMIC e IMPLEMENT_DYNAMIC, o DECLARE_DYNCREATE e IMPLEMENT_DYNCREATE, ou as DECLARE_SERIALIMPLEMENT_SERIAL macros explicadas no artigo Derivando uma classe de CObject, a CObject classe terá a capacidade de determinar a classe exata de um objeto em tempo de execução.
Essa capacidade é mais útil quando a verificação extra de tipos de argumentos de função é necessária e quando você deve escrever código de finalidade especial com base na classe de um objeto. No entanto, essa prática geralmente não é recomendada porque duplica a funcionalidade de funções virtuais.
A CObject função IsKindOf membro pode ser usada para determinar se um objeto específico pertence a uma classe especificada ou se é derivada de uma classe específica. O argumento para IsKindOf é um objeto CRuntimeClass, que você pode obter usando a macro RUNTIME_CLASS com o nome da classe.
Para usar a macro RUNTIME_CLASS
Use
RUNTIME_CLASScom o nome da classe, conforme mostrado aqui para a classeCObject:CRuntimeClass *pClass = RUNTIME_CLASS(CObject);
Você raramente precisará acessar o objeto de classe em tempo de execução diretamente. Um uso mais comum é passar o objeto de classe em tempo de execução para a função IsKindOf, conforme mostrado no próximo procedimento. A IsKindOf função testa um objeto para ver se ele pertence a uma classe específica.
Para usar a função IsKindOf
Verifique se a classe tem suporte de classe em tempo de execução. Ou seja, a classe deve ter sido derivada direta ou indiretamente de
CObjecte usado as macros DECLARE_DYNAMIC eIMPLEMENT_DYNAMIC,DECLARE_DYNCREATEeIMPLEMENT_DYNCREATE, ouDECLARE_SERIALeIMPLEMENT_SERIALconforme explicado no artigo Derivando uma classe de CObject.Chame a
IsKindOffunção membro para objetos dessa classe, usando aRUNTIME_CLASSmacro para gerar oCRuntimeClassargumento, conforme 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 retornará TRUE se o objeto for um membro da classe especificada ou de uma classe derivada da classe especificada.
IsKindOfnão dá suporte a herança múltipla ou classes base virtuais, embora você possa usar herança múltipla para suas classes derivadas Microsoft Foundation, se necessário.
Um uso de informações de classe em tempo de execução está na criação dinâmica de objetos. Esse processo é discutido no artigo Criação dinâmica de objeto.
Para obter informações mais detalhadas sobre serialização e informações de classe em tempo de execução, consulte os artigos Arquivos em MFC e Serialização.