"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية تحقيق المكافئ C++ لمشغل \"مثيل\" Java؟

كيفية تحقيق المكافئ C++ لمشغل \"مثيل\" Java؟

تم النشر بتاريخ 2024-11-17
تصفح:656

How to Achieve the C   Equivalent of Java\'s \

كيفية تحقيق مكافئ C لمثيل Java

في Java، يسمح لك عامل التشغيل "instanceof" بتحديد ما إذا كان الكائن ينتمي إلى فئة معينة أو واجهة. في لغة C، هناك عدة طرق لتحقيق هذه الوظيفة.

الصب الديناميكي مع RTTI

أحد الأساليب هو استخدام الصب الديناميكي مع تمكين معلومات نوع وقت التشغيل (RTTI). يتطلب هذا منك تضمين الرؤوس الضرورية:

#include 
#include 

وبعد ذلك يمكنك إجراء تحويل ديناميكي باستخدام:

if(NewType* v = dynamic_cast(old)) {
   // old was safely casted to NewType
   v->doSomething();
}

لاحظ أن هذا الأسلوب يتطلب تمكين دعم RTTI في المترجم الخاص بك.

الوظائف الافتراضية

هناك طريقة أخرى وهي استخدام الوظائف الافتراضية. يمكنك تحديد دالة افتراضية في الفئة الأساسية وتجاوزها في الفئات المشتقة. بعد ذلك، يمكنك التحقق من النوع الديناميكي للكائن عن طريق استدعاء وظيفته الافتراضية:

class Base {
public:
    virtual void doSomething() {}
};

class Derived : public Base {
public:
    void doSomething() override {}
};

...

if(auto* derived = dynamic_cast(old)) {
    derived->doSomething();
}

تبديل النوع أخيرًا، يمكنك استخدام مفتاح النوع لتحديد النوع الديناميكي للكائن. يعتمد هذا الأسلوب على فئة type_info:

if(old.IsSameAs(typeid(NewType))) { // تم إرسال القديم بأمان إلى NewType NewType* v = static_cast(old); v->doSomething();
if(old.IsSameAs(typeid(NewType))) {
    // old was safely casted to NewType
    NewType* v = static_cast(old);
    v->doSomething();
}
الاعتبارات

على الرغم من أن هذه الطرق توفر وظائف مشابهة لمشغل "مثيل" Java، فمن المهم أن تتذكر أن الصب الديناميكي والتحقق من النوع يمكن أن يؤدي إلى عقوبات على الأداء. من المستحسن النظر في استخدام أساليب بديلة مثل الوظائف الافتراضية أو مفاتيح الكتابة للحصول على أداء أفضل في التطبيقات الهامة.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3