题
为什么不能访问基类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;
}
};
解决方案
一个的构造之前B的运行,并且,隐式或显式地,前者构建体A的所有实例,包括a
构件。因此B无法在a
使用构造,因为那场已建成。你试图使用的符号表示确切地使用构造上a
,并在这一点上它只是不可能的。
其他提示
要建立在亚历通过控制其结构,像这样的回答,可以初始化基类的的‘一’强>构件:
class B : public A
{
public:
explicit B(int a1) : A(a1) { } // This initializes your inherited "a"
...
};
请注意,我构造的基类(大写的 “A”强>)的上方,而不是试图直接初始化它继承的成员(小写的 “一”下,绘图从你的例子)。
要进一步巩固段落符号的答案,你可以很容易地通过在B级覆盖它初始化是你想要的成员:
class B : public A
{
public:
int a; // override a
explicit B(int a1) : a(a1) // works now
{
}
...
};
虽然,我不一定会推荐这种;)
不隶属于 StackOverflow