ما الفرق بين regular cast و static_cast و dynamic_cast في C++؟
مرحبًا أيها الزملاء! أنا أتعلم C++ وقد تشوشت في تحويلات الأنواع. في الكتب المدرسية غالبًا ما يُكتب: 'تجنب C-style cast'، لكن لا يشرحون لماذا. أكتب تسلسلًا هرميًا بسيطًا للفئات: هناك الفئة الأساسية `Shape` والفئات المشتقة `Circle` و `Rectangle`. عندما أحاول تحويل مؤشر من `Shape*` إلى `Circle*`، أستخدم C-style cast العادي: `(Circle*)shape_ptr`. يبدو أنه يعمل، لكن المترجم أحيانًا يشتكي أو البرنامج يتعطل. ثم تعلمت عن `static_cast` و `dynamic_cast`.
هذا مثال يربكني:
```cpp
class Shape { public: virtual ~Shape() {} };
class Circle : public Shape { public: void drawCircle() { /* ... */ } };
class Rectangle : public Shape { public: void drawRect() { /* ... */ } };
void process(Shape* s) {
// الخيار 1: C-style cast
Circle* c1 = (Circle*)s;
c1->drawCircle(); // أحيانًا يتعطل إذا كان s هو Rectangle
// الخيار 2: static_cast
Circle* c2 = static_cast(s);
c2->drawCircle(); // يتم ترجمته، لكنه أيضًا خطير
```