首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C++:继承字段的初始化

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

Stack Overflow用户
提问于 2010-10-21 12:11:11
回答 4查看 13.9K关注 0票数 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应该是B的成员,而父类AB中初始化m_int时应该已经初始化了(因为父构造函数在继承类的成员初始化之前运行)。我的推理中哪里错了?这段代码到底发生了什么?

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-10-21 12:14:54

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

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

票数 22
EN

Stack Overflow用户

发布于 2010-10-21 12:15:21

你想要的是:

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

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

编辑:

从上面的注释可以看出,当你试图在B中初始化m_int变量时,编译器会报错的原因是它已经被A的构造函数初始化了。也就是说,你不能重新初始化某些东西,只能重新分配。因此,您可以像上面所述的Ben Jackson那样重新分配,也可以在适当的位置进行初始化。

票数 4
EN

Stack Overflow用户

发布于 2010-10-21 12:17:20

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

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

class B: public A
{
public:
  B(): A(2) {}
};
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3984215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档