22

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

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应该是 的成员,并且在 in 的初始化发生时B父类A应该已经被初始化(因为父构造函数在继承类的成员初始化之前运行)。我的推理哪里出错了?这段代码到底发生了什么?m_intB

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

4

4 回答 4

22

您需要为 A 创建一个构造函数(它可以受到保护,因此只有 B 可以调用它)它像您一样初始化 m_int ,然后:A(0)在您拥有的地方调用:m_int(0)

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

于 2010-10-21T04:14:53.863 回答
4

你想要的是这样的:

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

以便m_int在正确的位置初始化。

编辑:

根据上面的评论,当您尝试初始化m_int变量时编译器抱怨的原因B是它已经被A. 也就是说,您不能重新初始化某些东西,只能重新分配。因此,您可以像上面所说的 Ben Jackson 那样重新分配,也可以在适当的位置进行初始化。

于 2010-10-21T04:15:21.200 回答
4

为了构造一个类的实例,B你首先实例化一个类的实例A。在该实例化期间m_int被初始化。在初始化之后b调用构造函数,所以你不能重新初始化m_int。如果这是你的目标,那么你可以实现一个构造函数,它需要一个 int ,然后在的初始化列表A中调用它:B

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

class B: public A
{
public:
  B(): A(2) {}
};
于 2010-10-21T04:17:20.297 回答
0

在 A 中创建一个构造函数并使用 B(): A(2) {} 而不是 B():m_int(0){} 它的工作。

于 2017-05-05T09:53:56.930 回答