سؤال

لماذا لا يمكنني الوصول إلى قاعدة الأساس A عضو في قائمة تهيئة الفئة B؟

   class A
    {
    public:
        explicit A(int a1):a(a1)
        {
        }
        explicit A()
        {
        }

    public:
        int a; 

    public:
        virtual int GetA()
        {
            return a;
        }
    };

    class B : public A
    {
    public:
        explicit B(int a1):a(a1) // wrong!, I have to write a = a1 in {}. or use A(a1)
        {
        }
        int GetA()
        {
            return a+1;
        }
    };

    class C : public A
    {
    public:
        explicit C(int a1):a(a1)
        {
        }
        int GetA()
        {
            return a-1;
        }
    };
هل كانت مفيدة؟

المحلول

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

نصائح أخرى

للبناء على إجابة alex، يمكنك تهيئة الفئة الأساسية " "أ" عضو عن طريق التحكم في بناءه، مثل ذلك:

class B : public A
{
public:
    explicit B(int a1) : A(a1) { }  // This initializes your inherited "a"
    ...
};

لاحظ أنني بناء الطبقة الأساسية (رأس المال "أ") أعلاه، بدلا من محاولة تهيئة عضوها الموروث مباشرة (أحرف صغيرة "أ", ، الرسم من مثالك).

للبناء على إجابة Pilcrow، يمكنك بسهولة تهيئة العضو وكأنك ترغب في تجاوزه في صفك B:

class B : public A
{
public:
    int a; // override a

    explicit B(int a1) : a(a1) // works now
    {
    }

    ...
};

رغم ذلك، لن أوصي بالضرورة هذا؛)

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