C ++:继承字段的初始化C ++:继承字段的初始化(C++: Initialization of

2019-05-12 10:24发布

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

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_intB发生(因为父构造继承的类的成员初始化之前运行)。 哪里是我的推理错了吗? 什么是真正的在这个代码会发生什么?

EDIT :我知道其他的可能性来初始化这个成员(基类的构造或派生的构造函数分配),但我想知道为什么是它在我尝试的方式非法的? 一些具体的C ++语言功能或这样? 请点我在C ++标准,如果可能的一个段落。

Answer 1:

你需要为A(它可被保护,只有B能调用它),它初始化m_int构造就像你有,那么你调用:A(0)你必须:m_int(0)

你也可以只设置m_int = 0在B的构造方法体。 它是可访问的(如你描述),它只是不具备的特殊构造函数的语法。



Answer 2:

为了构建类的一个实例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) {}
};


Answer 3:

你想要的是这样的:

class A{
public:
    A() : m_int(0);
    int m_int;
};

使m_int是在正确的位置进行初始化。

编辑:

从上面的注释,原因编译器会抱怨当您尝试初始化m_int变量B是,它已经被通过的构造函数初始化A 。 也就是说,你不能重新初始化的东西,只有重新分配。 所以,你可以重新像本 - 杰克逊如上所述,也可以在适当的位置初始化。



Answer 4:

使所述的一个构造函数和使用B():A(2){} B的insteed():m_int(0){}其工作。



文章来源: C++: Initialization of inherited field