¿Cuál es la diferencia entre regular cast, static_cast y dynamic_cast en C++?
¡Hola, colegas! Estoy aprendiendo C++ y estoy confundido con las conversiones de tipos. En los libros de texto a menudo escriben: "evite el C-style cast", pero no explican por qué. Estoy escribiendo una jerarquía de clases simple: hay una clase base `Shape` y las derivadas `Circle` y `Rectangle`. Cuando intento convertir un puntero a `Shape*` a `Circle*`, uso el C-style cast normal: `(Circle*)shape_ptr`. Parece funcionar, pero a veces el compilador se queja o el programa se cuelga. Luego aprendí sobre `static_cast` y `dynamic_cast`.
Aquí hay un ejemplo 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) {
// Opción 1: C-style cast
Circle* c1 = (Circle*)s;
c1->drawCircle(); // A veces se cuelga si s es Rectangle
// Opción 2: static_cast
Circle* c2 = static_cast(s);
c2->drawCircle(); // Se compila, pero también es peligroso
}