Qual é a diferença entre static_cast, dynamic_cast, reinterpret_cast e a conversão de tipo estilo C em C++?
Olá a todos! Comecei a estudar C++ e não consigo entender as conversões de tipo. Em livros e fóruns, falam sobre `static_cast`, `dynamic_cast`, `reinterpret_cast` e também sobre a antiga conversão estilo C com parênteses. Quando programo em C, simplesmente escrevo `(int)myDouble`, e tudo funciona. Mas em C++, dizem que isso é ruim e que devo usar o estilo C++.
Por exemplo, tenho uma hierarquia de classes:
```cpp
class Base { public: virtual ~Base() {} };
class Derived : public Base { public: void foo() {} };
```
Quero converter `Base*` para `Derived*`. Parece que posso escrever `(Derived*)basePtr`, e isso compila. Mas o que é melhor usar? Ouvi dizer que `dynamic_cast` pode retornar `nullptr` se a conversão falhar, enquanto `static_cast` não faz isso. E ainda tem `reinterpret_cast`, que quebra tudo.
Ajude-me a entender: qual cast usar em cada situação? Existem casos em que a conversão estilo C ainda é aceitável? E por que em C++ existem tantas conversões diferentes?