我有一个关于在派生类的构造函数继承成员的初始化问题。 示例代码:
class A
{
public:
int m_int;
};
class B: public A
{
public:
B():m_int(0){}
};
此代码给我下面的输出:
In constructor 'B::B()': Line 10: error: class 'B' does not have any field named 'm_int'
(见http://codepad.org/tn1weFFP )
我猜为什么出现这种情况? m_int
应的构件B
,和父类A
时的初始化应该已经被初始化m_int
在B
发生(因为父构造继承的类的成员初始化之前运行)。 哪里是我的推理错了吗? 什么是真正的在这个代码会发生什么?
EDIT
:我知道其他的可能性来初始化这个成员(基类的构造或派生的构造函数分配),但我想知道为什么是它在我尝试的方式非法的? 一些具体的C ++语言功能或这样? 请点我在C ++标准,如果可能的一个段落。
你需要为A(它可被保护,只有B能调用它),它初始化m_int构造就像你有,那么你调用:A(0)
你必须:m_int(0)
你也可以只设置m_int = 0
在B的构造方法体。 它是可访问的(如你描述),它只是不具备的特殊构造函数的语法。
为了构建类的一个实例B
先实例化类的一个实例A
。 在此期间,实例化m_int
被初始化。 这是intialization,经过b
的构造函数被调用,所以你不能重新初始化m_int
。 如果这是你的目标,那么你可以实现一个构造A
接受一个int,然后调用,在B
的初始化列表:
class A
{
public:
A(int x): m_int(x) {}
int m_int;
};
class B: public A
{
public:
B(): A(2) {}
};
你想要的是这样的:
class A{
public:
A() : m_int(0);
int m_int;
};
使m_int
是在正确的位置进行初始化。
编辑:
从上面的注释,原因编译器会抱怨当您尝试初始化m_int
变量B
是,它已经被通过的构造函数初始化A
。 也就是说,你不能重新初始化的东西,只有重新分配。 所以,你可以重新像本 - 杰克逊如上所述,也可以在适当的位置初始化。
使所述的一个构造函数和使用B():A(2){} B的insteed():m_int(0){}其工作。