باستخدام الإعلان (فئة مشتقة)
-
30-09-2019 - |
سؤال
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; };