我有一个关于继承成员在派生类的构造函数中初始化的问题。示例代码:C++:继承域的初始化
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
的成员,并且在B
发生时由于父构造函数在继承类的成员初始化之前运行而初始化m_int
时,父类A
应该已经初始化。我的推理在哪里出错?这段代码真的发生了什么?我知道其他可能性来初始化这个成员(派生构造函数的基础构造函数或赋值),但我想明白为什么它在我尝试它的方式是非法的?一些特定的C++语言功能或类似?如果可能的话,请用C++标准指出一个段落。
这是一个很好的答案,但我只是想补充一些解释。当你使用:操作符时,你告诉编译器,在它做任何事情之前,它应该运行这些指令。基本上你是在父构造函数(或其他任何东西)运行之前设置一个变量。因此该变量不存在。 :A(),m_int(0)也应该起作用。默认情况下,如果您不使用:,编译器将运行基类构造函数。换句话说,如果你什么都不做,C++会为你做默认事情,如果你开始指定事情,它会假设你知道你在做什么。 – 2010-10-21 09:29:35
嗯...据我所知,父类的构造函数总是在任何其他初始化之前运行,所以当我尝试初始化时,变量m_int已经存在。所以这不应该成为问题... – Haspemulator 2010-10-21 10:30:25
@Haspemulator是的,它已经存在,但这就是为什么你会得到错误。它已经由A的构造函数默认初始化了。你不能在B的构造函数中重新初始化一个变量。你可以像Ben Jackson在上面所述的那样重新分配('m_int = 0'),那就是关于它的。 – wheaties 2010-10-21 13:14:07