سؤال

struct B1{
  int d;
  void fb(){};
};

struct B2 : B1{
  using B1::d;
  using B1::fb;

  int d;               // why this gives error?
  void fb(){}          // and this does not?
};

int main(){}

هل هذا بسبب، B1::fb() يعامل باسم B1::fb(B1*) and B2::fb() تعامل كما B2::fb(B2*)؟ وهذا هو ، هل المعلمة الضمنية ، تساعد في التمييز بين هذه؟

$13.3.1/4-

بالنسبة لوظائف عدم التحول التي تم تقديمها بواسطة A-Declaration إلى فئة مشتقة ، تعتبر الوظيفة عضوًا في الفئة المشتقة لغرض تحديد نوع المعلمة الكائن الضمنية.

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

المحلول

يشرح معيار C ++ (C ++ 03 §7.3.3/12):

عندما باستخدام النهر يجلب أسماء من فئة أساسية إلى نطاق فئة مشتق ، وظائف الأعضاء في تجاوز الفئة المشتقة و/أو إخفاء وظائف الأعضاء مع نفس الاسم وأنواع المعلمات في فئة أساسية (بدلاً من التعارض).

في مثالك ، B2::fb() يخفي B1::fb() قدم من قبل استخدام الإعلان.

أما السبب في أنه من غير المعقول أن يكون كلاهما using B1::d; و int d; في تعريف B2, ، يشرح معيار C ++ (C ++ 03 §7.3.3/10):

منذ أ باستخدام النهر هو إعلان ، القيود المفروضة على إعلانات تحمل نفس الاسم في نفس المنطقة التصريحية تنطبق أيضًا باستخدام الأسماء.

لذلك ، يتم تشكيله لنفس السبب الذي يجعل ما يلي غير مشكل: فهو يؤدي إلى كائنين لهما نفس الاسم في منطقة إعلانية واحدة:

struct S { int d; int d; };
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top