كيفية استدعاء وظيفة التحميل الزائد للطفل في تعدد الأشكال؟
-
30-09-2019 - |
سؤال
النظر في تعدد الأشكال البسيطة التالية ...
class Parent {
public:
someFunc() { /* implementation A */ };
};
class Child : public Parent {
public:
someFunc() { /* implementation B */ };
};
int main ()
{
Parent* ptr;
ptr = new Parent();
ptr->someFunc();
delete ptr;
ptr = new Child();
ptr->someFunc();
delete ptr;
return 0;
}
بقدر ما أستطيع أن أقول ، في كلتا الحالتين سيتم استدعاء التنفيذ A.
كيف يمكنني استدعاء تطبيق "الأكثر اشتقاقًا" لـ SomeFunc ، اعتمادًا على النوع الديناميكي من PTR؟
يوجد في الكود الحقيقي العديد من أنواع الأطفال ، لذلك لن يكون من العملي استخدام Dynamic_Cast للتحقق من فئة الطفل.
المحلول
محاولة:
class Parent
{
public:
virtual someFunc() { /* implementation A */ };
//^^^^^^^
};
على الرغم من أنه غير مطلوب من الناحية الفنية.
أجد دائمًا أنه أسلوب جيد لإعلان الوظيفة المشتقة الافتراضية:
class Child : public Parent
{
public:
virtual someFunc() { /* implementation B */ };
};
على عكس وظائف Java ليست افتراضية.
نصائح أخرى
يعلن someFunc
افتراضية. سيضمن ذلك أن يتم استدعاء تنفيذ الكائن الفعلي ، وليس التنفيذ اعتمادًا على نوع المؤشر.
ومع ذلك ، فإن هذا سيضيف بعض النفقات العامة المرتبطة بإنشاء الدعوة القابلة للحياة والأبطأ للوظيفة الافتراضية ، ولكنه في الأساس ما هو تعدد الأشكال.
لا يوجد تعدد الأشكال هنا! لا شيء من وظائفك virtual
.
إذا كنت تريد تعدد الأشكال ، افعل هذا:
class Parent {
public:
virtual someFunc() { /* implementation A */ };
};