سؤال

كنت أقرأ C++0x التعليمات من خلال Stroustrup و علقت مع هذا القانون.النظر في التعليمات البرمجية التالية

struct A
{
    void f(double)
    {
        std::cout << "in double" << std::endl;
    }
};

struct B : A
{
    void f(int)
    {
        std::cout << "in int" << std::endl;
    }
};


int main()
{
    A a; a.f(10.10);  // as expected, A.f will get called
    B b; b.f(10.10);  // This calls b.f and we lose the .10 here
    return 0;
}

كان فهمي عندما اكتب ورثت كل المحمية والعامة الأعضاء سوف تكون متاحة من فئة مشتقة.ولكن حسب هذا المثال ، يبدو أنا الخاطئ.كنت أتوقع ب.f سيتم استدعاء قاعدة الطبقات f.حصلت النتيجة المتوقعة خلال تغيير فئة مشتقة مثل

struct B : A
{
    using A::f;
    void f(int)
    {
        std::cout << "in int" << std::endl;
    }
};

الأسئلة

  1. لماذا كان لا يعمل في أول الكود ؟
  2. أي قسم في C++ القياسية يصف كل نطاق هذه القواعد ؟
هل كانت مفيدة؟

المحلول

أول مدونة تعمل c++ هي مصممة للعمل.

الحمولة الزائدة القرار يلي معقد جدا مجموعة من القواعد.من Stroustrup c++ الكتاب المقدس 15.2.2 "[أ]mbiguities بين وظائف من مختلف فئات أساسية لم يتم حلها على أساس الحجة أنواع."

يذهب إلى شرح استخدام "باستخدام" كما وصفت لك.

كان هذا القرار التصميم في اللغة.

أنا أميل إلى اتباع Stroustrup الكتاب بدلا من معيار ، ولكن أنا متأكد من أنه هو في هناك.

[عدل]

هنا هو (من معيار):

الفصل 13

عندما اثنين أو أكثر من مختلف الإعلانات المحددة على اسم واحد في نفس نطاق هذا الاسم هو ان يكون فوق طاقتها.

ثم:

13.2 إعلان المطابقة

1 وظيفة الإعلانات من نفس اسم الرجوع إلى نفس الوظيفة إذا كانوا في نفس النطاق قد تعادل المعلمة الإعلانات (13.1).وظيفة الأعضاء من فئة مشتقة ليست في نفس النطاق بوصفها وظيفة عضو نفس الاسم في الفئة الأساسية.

نصائح أخرى

لأن A::f هو "مخفي" بدلا من "زائد" أو "تجاوز".الرجوع:

http://www.parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.9

البحث عن الزائد القرار.A مماثلة, ولكن ليست متطابقة السؤال.

في C++, لا يوجد أي إثقال عبر نطاقات, راقب في الفئات المشتقة ليست استثناء.(حسب لغة البرمجة C++)

للحصول على مزيد من المعلومات ، راجع http://www.research.att.com/~bs/bs_faq2.html#overloadderived

في الحالة الأولى ، قاعدة أسلوب فئة " f " هو خفية من قبل فئة مشتقة الأسلوب.في C++ لا يوجد أي إثقال عبر نطاقات;هذا هو السبب في أنه لا يسمى.C++ القياسية يفسر كل عضو اسم بحث القواعد في القسم 10.2 الأعضاء البحث عن اسم [الصف.الأعضاء.البحث].HTH

النسخة الأولى من التعليمات البرمجية حقا ينبغي أن اتصل ب::f.يمكنك إعادة تحديد الرمز "و" في البنية "ب" ، لذلك يخفي رمز الأصلي "و" من البنية "أ".وليس الزائد ، كما قد يبدو.

كلما مترجم يلتقي ب.و () ، فهو يبحث في "ب" البنية على رمز "f".كان موجودا هناك ، لذلك مترجم تقرر الاتصال ب::f(الباحث), تحويل مزدوجة إلى int.أنه لا يرى حاجة إلى مسح الطبقة الأم أكثر مناسبة وظيفة...

حتى عند إضافة "باستخدام::f" ، explict التوجيه مترجم إلى مسح الوالدين فئة رمز "f".الآن, الفئة ب فقد اثنين من طاقتها وظائف:على الباحث وعلى مزدوجة.

وأعتقد أيضا أن يمكن كتابة b.A::f() دون استخدام "باستخدام" التوجيه في المثال الأصلي...

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