Avatar ·

ما الفرق بين static_cast و dynamic_cast و reinterpret_cast و التحويل بنمط C في C++؟

مرحباً بالجميع! لقد بدأت للتو في تعلم C++ ولا أستطيع فهم تحويلات الأنواع. في الكتب والمنتديات يكتبون عن `static_cast` و `dynamic_cast` و `reinterpret_cast` وأيضاً عن التحويل القديم بنمط C باستخدام الأقواس المستديرة. عندما كنت أكتب بلغة C، كنت ببساطة أكتب `(int)myDouble` وكان كل شيء يعمل. لكن في C++ يقولون لي أن هذا سيء ويجب استخدام نمط C++. على سبيل المثال، لدي تسلسل هرمي للفئات: ```cpp class Base { public: virtual ~Base() {} }; class Derived : public Base { public: void foo() {} }; ``` أريد تحويل `Base*` إلى `Derived*`. يبدو أنه يمكنني كتابة `(Derived*)basePtr` وسيتم تجميعه. لكن ما الأفضل استخدامه؟ سمعت أن `dynamic_cast` يمكن أن يعيد `nullptr` إذا فشل التحويل، بينما `static_cast` لا يفعل ذلك. وهناك أيضاً `reinterpret_cast` الذي يكسر كل شيء. ساعدوني في الفهم: أي تحويل يجب استخدامه ومتى؟ هل هناك حالات يكون فيها التحويل بنمط C مقبولاً؟ ولماذا جعلوا في C++ هذا العدد الكبير من التحويلات المختلفة؟