C++:继承字段的初始化

Has*_*tor 20 c++ initialization initialization-list

我有一个关于在派生类的构造函数中初始化继承成员的问题.示例代码:

class A
    {
public:
    int m_int;
    };

class B: public A
    {
public:
    B():m_int(0){}
    };
Run Code Online (Sandbox Code Playgroud)

这段代码给了我以下输出:

In constructor 'B::B()': Line 10: error: class 'B' does not have any field named 'm_int'

(见http://codepad.org/tn1weFFP)

我猜这是为什么会这样?m_int应该是on的成员B,并且Am_intin的初始化B发生时,父类应该已经被初始化(因为父构造函数在继承类的成员初始化之前运行).我的推理错在哪里?这段代码到底发生了什么?

EDIT:我知道初始化这个成员的其他可能性(基础构造函数或派生构造函数中的赋值),但我想理解为什么它在我尝试的方式中是非法的?一些特定的C++语言功能还是这样的?如果可能的话,请指出C++标准的段落.

Ben*_*son 21

你需要为A创建一个构造函数(它可以被保护,所以只有B可以调用它),它会像你一样初始化m_int,然后你调用:A(0)你所拥有的位置:m_int(0)

你也可以设置m_int = 0B的构造函数的主体.它是可访问的(如您所述),它在特殊构造函数语法中不可用.

  • 这是一个很好的答案,但我只是想补充一些解释.当您使用:运算符时,您告诉编译器在执行任何其他操作之前应该运行这些指令.基本上你是在父构造函数(或其他任何东西)运行之前设置一个变量.因此变量不存在.:A(),m_int(0)也应该有效.默认情况下,如果不使用:,编译器将运行基类构造函数.换句话说,如果你什么也不做,C++会为你做默认的事情,如果你开始指定事情,它会假设你知道你在做什么. (5认同)