Avatar ·

ما الفرق بين 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(); // يتم ترجمته، لكنه أيضًا خطير ```