كيفية استدعاء وظيفة التحميل الزائد للطفل في تعدد الأشكال؟

StackOverflow https://stackoverflow.com/questions/3927861

  •  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 */ };
};
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top