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

لماذا لا يدعم الوراثة المتعددة الوظائف المثقلة بنفس الاسم ولكن بتوقيعات مختلفة؟

تم النشر بتاريخ 2024-12-23
تصفح:353

Why Doesn't Multiple Inheritance Support Overloaded Functions with the Same Name but Different Signatures?

الوظائف المحملة فوق طاقتها مع الوراثة المتعددة

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

وفقًا للقسم 10.2/2 من معيار C، تنص قواعد البحث عن الأعضاء على حذف الإعلانات المخفية من الاعتبار أثناء البحث عن الاسم. عندما تحدد فئات أساسية متعددة وظائف بنفس الاسم ولكن بمعلمات مختلفة، فقد تكون هذه الوظائف مخفية عن بعضها البعض. ولذلك، إذا كانت مجموعة الإعلانات الناتجة ليست من كائنات فرعية من نفس النوع، أو تتضمن عضوًا غير ثابت وأعضاء من كائنات فرعية مختلفة، ينشأ غموض ويعتبر البرنامج سيئ التكوين.

على سبيل المثال:

class A {
public:
  int f(int);
};

class B {
public:
   int f();
};

class C : public A, public B {};

في هذه الحالة، f غامض لأنه تم تعريفه في فئتين أساسيتين مختلفتين (A و B). لذلك، الاستدعاء التالي إلى f من الفئة C غير صحيح:

int main() {
  C c;
  c.f();  // ambiguous
}

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

class C : public A, public B {
     using A::f;
     using B::f;
};

مع هذا التعديل، c.f() يستدعي الآن f بشكل صريح من الفئة A، مما يحل الغموض.

في المقابل، المثال الثاني للكود الذي قدمته يعمل لأنه تم تعريف foo(float) ضمن نطاق الفئة المشتقة، ولا يتم توريثها من فئات أساسية متعددة. لذلك، يقوم d.foo(5) باستدعاء الدالة foo(float) مباشرة، دون أي غموض.

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

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

Copyright© 2022 湘ICP备2022001581号-3