I'há quase vinte anos que escrevo código C e C++, mas há um aspecto destas linguagens que eu'nunca entendi realmente. I'obviamente usaram casts regulares i.e.
MyClass *m = (MyClass *)ptr;
por todo o lado, mas parece haver outros dois tipos de elenco, e eu não'não sei a diferença. Qual'é a diferença entre as seguintes linhas de código?
MyClass *m = (MyClass *)ptr;
MyClass *m = static_cast<MyClass *>(ptr);
MyClass *m = dynamic_cast<MyClass *>(ptr);
Você deve olhar para o artigo C++ Programação/ Tipo de Fundição.
Ele contém uma boa descrição de todos os diferentes tipos de elenco. O seguinte, retirado do link acima:
const_cast
const_cast
(expressão) A const_cast<>() é usada para adicionar/remover const(ness) (ou volátil-ness) de uma variável. static_cast
static_cast
(expressão) O static_cast<>() é usado para lançar entre os tipos inteiros. por exemplo: char->long, int->short, etc. O elenco estático também é usado para lançar apontadores para tipos relacionados, para exemplo de fundição vazia* para o tipo apropriado.
dynamic_cast
O elenco dinâmico é usado para converter apontadores e referências em tempo de execução, geralmente com o propósito de lançar um ponteiro ou referência para cima ou para baixo uma cadeia sucessória (hierarquia sucessória).
dynamic_cast
(expressão) O tipo de alvo deve ser um ponteiro ou tipo de referência, e o a expressão deve avaliar a um ponteiro ou referência. Obras dinâmicas de elenco apenas quando o tipo de objecto a que a expressão se refere é compatível com o tipo de alvo e a classe base tem pelo menos um função de membro virtual. Se não, e o tipo de expressão que está sendo lançada é um ponteiro, NULL é retornado, se um elenco dinâmico sobre uma referência falha, é lançada uma excepção de mau_cast. Quando não falha, dinâmico elenco retorna um ponteiro ou referência do tipo alvo para o objeto à qual se referia a expressão.
reinterpretar_cast
Reinterprete fundido simplesmente funde um tipo bit a bit para outro. Qualquer ponteiro ou tipo integral pode ser fundido para qualquer outro com elenco reinterpretado, permitindo facilmente o uso indevido. Por exemplo, com a reinterpretação de um pode, sem segurança, lançar um ponteiro inteiro para um ponteiro de cordas.
Os elencos ao estilo de C conflitem const_cast, static_cast, e reinterpret_cast.
Quem me dera que o C++ não tivesse moldes ao estilo do C. Os elencos de C++ se destacam corretamente (como deveriam; os elencos são normalmente indicativos de fazer algo ruim) e distinguem corretamente entre os diferentes tipos de conversão que os elencos realizam. Eles também permitem que funções de aparência similar sejam escritas, por exemplo, boost::lexical_cast, o que é bastante bom de uma perspectiva de consistência.
O dinamic_cast
tem verificação do tipo de tempo de execução e só funciona com referências e indicadores, enquanto o static_cast
não oferece verificação do tipo de tempo de execução. Para informações completas, veja o artigo MSDN static_cast Operator.