Quelle est la différence entre regular cast, static_cast et dynamic_cast en C++ ?
Bonjour, collègues ! J'étudie le C++ et je suis confus au sujet des conversions de types. Dans les manuels, on écrit souvent : « évitez le C-style cast », mais sans expliquer pourquoi. J'écris une simple hiérarchie de classes : il y a une classe de base `Shape` et des classes dérivées `Circle` et `Rectangle`. Quand j'essaie de convertir un pointeur `Shape*` en `Circle*`, j'utilise un C-style cast ordinaire : `(Circle*)shape_ptr`. Cela semble fonctionner, mais le compilateur se plaint parfois ou le programme plante. Ensuite, j'ai découvert `static_cast` et `dynamic_cast`.
Voici un exemple qui me trouble :
```cpp
class Shape { public: virtual ~Shape() {} };
class Circle : public Shape { public: void drawCircle() { /* ... */ } };
class Rectangle : public Shape { public: void drawRect() { /* ... */ } };
void process(Shape* s) {
// Option 1 : C-style cast
Circle* c1 = (Circle*)s;
c1->drawCircle(); // Parfois plante si s est un Rectangle
// Option 2 : static_cast
Circle* c2 = static_cast(s);
c2->drawCircle(); // Se compile, mais aussi dangereux
}