Avatar ·

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?