الدوال الافتراضية وvtable
نفّذ تعدد الأشكال وقت التشغيل باستخدام الدوال الافتراضية، وافحص مفهوم vtable.
الدوال الافتراضية وvtable درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
الربط الثابت أم الديناميكي
تُربط استدعاءات الأعضاء افتراضيًا ربطًا ثابتًا — إذ يختار المصرّف الدالة بناءً على النوع المُعلن. ومع الدوال virtual، يُجرى الربط الديناميكي بناءً على النوع الفعلي.
التصريح عن دالة virtual
ضع علامة virtual على الدالة في الفئة الأساسية. ويمكن للفئات المشتقة إعادة تعريفها.
class Shape {
public:
virtual double area() const = 0; // pure virtual
virtual ~Shape() = default;
};
class Circle : public Shape {
double r_;
public:
Circle(double r) : r_(r) {}
double area() const override { return 3.14159 * r_ * r_; }
};محدِّد override
أضف override إلى دوال الفئة المشتقة. ويتحقق المصرّف من أن الدالة تعيد تعريف دالة افتراضية فعلًا، ما يكشف الأخطاء المطبعية في التوقيع.
محدِّد final
يمنع final إعادة التعريف لاحقًا. استخدمه مع الفئات التي لا ينبغي الاشتقاق منها، أو مع الدوال التي لا ينبغي إعادة تعريفها مرة أخرى.
class Concrete final : public Base { /* ... */ };
class Base {
virtual void f() final; // cannot be overridden
};الاستدعاء عبر مؤشّر إلى الفئة الأساسية
هنا تكمن روعة تعدد الأشكال: يستطيع مؤشّر إلى الفئة الأساسية توجيه الاستدعاء إلى دالة الفئة المشتقة الصحيحة.
Shape* s = new Circle(3.0);
std::cout << s->area(); // 28.27... (Circle::area)
delete s;مفهوم vtable
تمتلك كل فئة متعددة الأشكال vtable مخفية — وهي جدول من مؤشرات الدوال. ويحتفظ كل كائن بمؤشّر مخفي (vptr) إلى vtable الخاصة بفئته.
تكلفة الاستدعاءات الافتراضية
يتطلب الاستدعاء الافتراضي إحالة إضافية واحدة عبر vtable. وتكون هذه التكلفة ضئيلة في معظم الشيفرات. تجنّبها في الحلقات الداخلية إذا ثبت بالقياس أنها عنق زجاجة.
الدوال الافتراضية المحضة
أضف = 0 لجعل الدالة افتراضية محضة. ويجب على الفئات المشتقة إعادة تعريفها حتى يمكن إنشاء كائنات منها. وتصبح الفئة مجردة.
المُهدِمات الافتراضية
إذا كانت للفئة أي دالة افتراضية، أو كان المقصود حذفها عبر مؤشّر إلى فئة أساسية، فامنحها مُهدِمًا افتراضيًا. وإلا فلن يُنفَّذ مُهدِم الفئة المشتقة.
class Base {
public:
virtual ~Base() = default; // safe to delete through Base*
};تعدد الأشكال باستخدام المؤشرات الذكية
احتفظ بالكائنات متعددة الأشكال عبر مؤشرات ذكية إلى الفئة الأساسية. ويتولى المؤشّر الذكي تدميرها بطريقة صحيحة.
std::unique_ptr<Shape> s = std::make_unique<Circle>(3.0);مشكلة الاقتطاع مجددًا
يؤدي تمرير كائن مشتق بالقيمة إلى دالة تتوقع الفئة الأساسية إلى اقتطاع الجزء الخاص بالفئة المشتقة. استخدم المراجع أو المؤشرات للوسائط متعددة الأشكال.
مفاضلة الأداء
تضيف الدوال الافتراضية مرونةً مقابل تكلفة صغيرة وقت التشغيل. وتوفر القوالب تعدد أشكال وقت الترجمة من دون تكلفة وقت تشغيل — فاختَر بناءً على حاجتك إلى تعدد الأشكال وقت التشغيل.
تحقق سريع
لماذا ينبغي أن تمتلك الفئة الأساسية متعددة الأشكال مُهدِمًا من النوع virtual؟
مراجعة
تتيح الدوال الافتراضية تعدد الأشكال وقت التشغيل عبر vtable خاصة بكل فئة. ضع override على الدوال المعاد تعريفها، وامنع الوراثة اللاحقة باستخدام final. امنح الفئات الأساسية متعددة الأشكال دائمًا مُهدِمًا افتراضيًا.
الأسئلة الشائعة
هل درس «الدوال الافتراضية وvtable» مجاني؟
نعم — نص درس «الدوال الافتراضية وvtable» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «الدوال الافتراضية وvtable»؟
نفّذ تعدد الأشكال وقت التشغيل باستخدام الدوال الافتراضية، وافحص مفهوم vtable. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «الدوال الافتراضية وvtable»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الوراثة المفردة والمتعددة
- الدوال الافتراضية وvtable
- الأصناف المجرّدة والطرائق الافتراضية الخالصة
- المفاضلة بين الوراثة والتركيب