estou acostumado a utilizar a conversão em tempo de execução, mas agora me assustei:
fiz a conversão de um tipo objeto estruturado como string para um void * e na recuperação utilizo static_cast ao inves de um dynamic_cast, porque isso ocorre?
string str = "kkasdf";
void *vpStr = &str;
string *pStr = static_cast<string *>(vpStr);
Não é uma conversão em tempo de execução?!?
Melhorei meu entendimento com a materia
[quote]static_cast
static_cast can perform conversions between pointers to related classes, not only from the derived class to its base, but also from a base class to its derived. This ensures that at least the classes are compatible if the proper object is converted, but no safety check is performed during runtime to check if the object being converted is in fact a full object of the destination type. Therefore, it is up to the programmer to ensure that the conversion is safe. On the other side, the overhead of the type-safety checks of dynamic_cast is avoided.
1
2
3
4
class CBase {};
class CDerived: public CBase {};
CBase * a = new CBase;
CDerived * b = static_cast<CDerived*>(a);
This would be valid, although b would point to an incomplete object of the class and could lead to runtime errors if dereferenced.
static_cast can also be used to perform any other non-pointer conversion that could also be performed implicitly, like for example standard conversion between fundamental types:
1
2
double d=3.14159265;
int i = static_cast<int>(d);
Or any conversion between classes with explicit constructors or operator functions as described in “implicit conversions” above.[/quote]
Fonte: http://www.cplusplus.com/doc/tutorial/typecasting/
Mas ainda não entendi o porque de não ser possível a utilização de dynamic_cast!
dynamic_cast funciona mais ou menos como se fosse o cast do Java, ou seja, ele lança uma exceção se não for possível efetuar o cast devido a incompatibilidade de tipos.
Entretanto, há limitações para o que pode ser feito. Neste caso, ao obtermos um endereço bruto como um void , a informação de tipos é completamente perdida (já que o C++ não tem um tipo Object como o Java ou o C#, se você converte um endereço para uma classe para um endereço bruto como um int ou um void*, perde-se a informação de tipos) e é por isso que a linguagem não deixa fazer o que você acha que daria para fazer.
Muito obrigado entanglement, finalmente creio que entendi.
Mesmo fugindo as especificações como em :
Fonte: http://www.cplusplus.com/doc/tutorial/typecasting/
Faz sentido não utilizar o dynamic_cast afinal de contas não é necessária nenhuma verificação RTTI, já que não temos informações de classe com um tipo bruto como foi dito. 