سؤال
لماذا لا يمكنني الوصول إلى قاعدة الأساس 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
{
}
...
};
رغم ذلك، لن أوصي بالضرورة هذا؛)
لا تنتمي إلى StackOverflow