لماذا لا تسمي هذه الطريقة افتراضية كما كنت أتوقع؟

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

  •  02-10-2019
  •  | 
  •  

سؤال

أريد أن أسأل ماذا حدث ، عندما أستخدم وظائف افتراضية بدون مؤشرات؟ فمثلا:

#include <iostream>
using namespace std;
class Parent
{
 public:
   Parent(int i) { }
   virtual void f() { cout<<"Parent"<<endl; }
};

class Child : public Parent
{
 public:
   Child(int i) : Parent(i) { }
   virtual void f() { Parent::f(); cout<<" Child"<<endl; }
};

int main()
{
    Parent a(2);
    Parent b = Child(2);
    a.f();
    b.f();
    return 0;
}

^^ لماذا لا يعمل؟ أين يمكنني أن أجد شيئًا عن كيفية عمل الأساليب الافتراضية حقًا؟

هل كانت مفيدة؟

المحلول

هذا التأثير يسمى "التقطيع".

Parent b = Child(2); // initializes a new Parent object using part of Child obj

في C ++ ، قد يختلف النوع الديناميكي فقط عن النوع الثابت للمراجع أو المؤشرات. لديك كائن مباشر. لذلك ، كانت شكوكك صحيحة بشكل أساسي.

نصائح أخرى

حاول القيام بما يلي:

std::auto_ptr<Parent> b = new Child(2);

في الرمز الخاص بك ، تقوم بنسخ جزء من Child يعترض على b. هذا يسمى تشريح الكائن.

يتم تمكين آلية الوظيفة الافتراضية فقط إذا تم استدعاء الوظيفة الافتراضية إما من خلال مرجع مناسب أو مؤشر مناسب. لاحظ أن آلية استدعاء الوظيفة الافتراضية يتم قمعها في مُنشئ/مدمرة أو أثناء استخدام المشغل ::.

إذا كان الكود كما هو موضح أدناه ، فسيتم تمكين آلية الوظيفة الافتراضية.

Child c;
Parent &a = c;
a.f();

بدون مؤشرات ، يتم ربط المكالمة بشكل ثابت ، حتى لو كانت مكالمة وظيفية افتراضية.

تحرير 2:

$ 10.3/6 - [ملاحظة: يعتمد تفسير دعوة الدالة الافتراضية على نوع الكائن الذي يطلق عليه (النوع الدينامي من المؤشر أو المرجع الذي يدل على هذا الكائن (النوع الثابت) (5.2.2).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top