dynamic_cast deve fazer o truque
TYPE& dynamic_cast<TYPE&> (object);
TYPE* dynamic_cast<TYPE*> (object);
A dynamic_cast
palavra-chave lança um dado de um ponteiro ou tipo de referência para outro, executando uma verificação de tempo de execução para garantir a validade da conversão.
Se você tentar converter o ponteiro para um tipo que não é um tipo de objeto real, o resultado da conversão será NULL. Se você tentar converter para fazer referência a um tipo que não é um tipo de objeto real, o elenco emitirá uma bad_cast
exceção.
Verifique se há pelo menos uma função virtual na classe Base para fazer o dynamic_cast funcionar.
Tópico da Wikipedia Informações sobre o tipo de tempo de execução
O RTTI está disponível apenas para classes polimórficas, o que significa que elas têm pelo menos um método virtual. Na prática, isso não é uma limitação porque as classes base devem ter um destruidor virtual para permitir que objetos de classes derivadas executem a limpeza adequada se forem excluídos de um ponteiro base.
dynamic_cast
joga se não for conversível? Existe uma maneira de fazer isso sem gerar um arremesso?A* aptr = dynamic_cast<A*>(ptr);
// não deveria ser assimuint8_t*
? Ou seja, posso verificar issouint32_t* x = dynamic_cast<uint32_t*>(p)
, ondep
estáuint8_t*
? (Estou tentando encontrar um teste para punir violações).O elenco dinâmico é o melhor para sua descrição do problema, mas quero apenas acrescentar que você pode encontrar o tipo de classe com:
fonte
11MyClass
. Para desmontar, você pode usar a biblioteca de extensão ABI emcxxabi.h
. Isto dá-lheabi::__cxa_demangle
o que lhe dará o verdadeiro nomeIsso se chama RTTI , mas você quase certamente deseja reconsiderar seu design aqui, porque encontrar o tipo e fazer coisas especiais com base nele torna seu código mais frágil.
fonte
Apenas para concluir, construirei o Robocide e apontarei que
typeid
pode ser usado sozinho, sem usar o nome ():Resultado:
fonte
Provavelmente, incorpore aos seus objetos uma "tag" de identificação e use-a para distinguir entre objetos da classe A e objetos da classe B.
No entanto, isso mostra uma falha no design. Idealmente, os métodos em B que A não possui devem fazer parte de A, mas são deixados em branco e B os substitui. Isso acaba com o código específico da classe e está mais no espírito do OOP.
fonte
Você está procurando
dynamic_cast<B*>(pointer)
fonte
Porque sua classe não é polimórfica. Experimentar:
Agora
BaseClas
é polimórfico. Alterei a classe para struct porque os membros de uma estrutura são públicos por padrão.fonte
Sua descrição é um pouco confusa.
De um modo geral, embora algumas implementações de C ++ possuam mecanismos para isso, você não deve perguntar sobre o tipo. Em vez disso, você deve fazer um dynamic_cast no ponteiro para A. O que isso fará é que, em tempo de execução, o conteúdo real do ponteiro para A será verificado. Se você tiver um B, receberá o ponteiro em B. Caso contrário, receberá uma exceção ou nulo.
fonte
Como outros indicaram, você pode usar dynamic_cast. Mas geralmente usar dynamic_cast para descobrir o tipo de classe derivada em que você está trabalhando indica um design incorreto. Se você estiver substituindo uma função que usa o ponteiro de A como parâmetro, ele deverá poder trabalhar com os métodos / dados da própria classe A e não deve depender dos dados da classe B. No seu caso, em vez de substituir, se você tenha certeza de que o método que você está escrevendo funcionará apenas com a classe B, então você deve escrever um novo método na classe B.
fonte
Use funções sobrecarregadas. Não requer suporte a dynamic_cast ou mesmo RTTI:
fonte
Se você pode acessar a biblioteca de aumento, talvez seja a função type_id_with_cvr () que você precisa, que pode fornecer o tipo de dados sem remover os modificadores const, volatile, & e && . Aqui está um exemplo simples no C ++ 11:
Espero que isso seja útil.
fonte