为什么我无法访问基类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;
}
};
答案 0 :(得分:6)
A的构造函数在B之前运行,并且隐式或显式地,前者构造A的所有实例,包括a
成员。因此B不能在a
上使用构造函数,因为该字段已经构造。您尝试使用的符号表示准确使用a
上的构造函数,此时这是不可能的。
答案 1 :(得分:6)
基于Alex的回答,您可以通过控制其构造来初始化基类“”“成员,如下所示:
class B : public A
{
public:
explicit B(int a1) : A(a1) { } // This initializes your inherited "a"
...
};
请注意,我正在构建上面的基类(大写“A”),而不是尝试直接初始化其继承的成员(小写“a”,绘图从你的例子)。
答案 2 :(得分:0)
为了进一步建立在pilcrow的答案上,您可以通过在B类中覆盖它来轻松初始化A成员:
class B : public A
{
public:
int a; // override a
explicit B(int a1) : a(a1) // works now
{
}
...
};
虽然,我不一定会推荐这个;)