Qual é a diferença entre regular cast, static_cast e dynamic_cast em C++?
Olá, colegas! Estou estudando C++ e fiquei confuso com as conversões de tipos. Nos livros, frequentemente escrevem: "evite C-style cast", mas não explicam por quê. Estou escrevendo uma hierarquia de classes simples: há uma classe base `Shape` e as derivadas `Circle` e `Rectangle`. Quando tento converter um ponteiro `Shape*` para `Circle*`, uso o C-style cast comum: `(Circle*)shape_ptr`. Parece funcionar, mas o compilador às vezes reclama ou o programa trava. Depois, aprendi sobre `static_cast` e `dynamic_cast`.
Aqui está um exemplo que me confunde:
```cpp
class Shape { public: virtual ~Shape() {} };
class Circle : public Shape { public: void drawCircle() { /* ... */ } };
class Rectangle : public Shape { public: void drawRect() { /* ... */ } };
void process(Shape* s) {
// Opção 1: C-style cast
Circle* c1 = (Circle*)s;
c1->drawCircle(); // Às vezes trava, se s for Rectangle
// Opção 2: static_cast
Circle* c2 = static_cast(s);
c2->drawCircle(); // Compila, mas também é perigoso
}