C ++使用派生类构造函数填充基类受保护的成员

时间:2015-07-28 17:59:33

标签: c++ inheritance

我有这样的事情:

Class Base
{
  public:
    Base();
  protected:
    someType myObject;
}

Class Child:public someNamespace::Base
{
   //constructor
   Child(someType x):myObject(x){}
}

Class Child和Base有2个不同的命名空间...... 编译器抱怨我的Child类没有名为myObject的字段

任何人都知道为什么?是因为从子构造函数填充Base成员是非法的吗?

由于

2 个答案:

答案 0 :(得分:3)

您无法像这样初始化继承的成员。相反,您可以为基类提供一个构造函数来初始化该成员,然后派生类可以调用该构造函数。

class Base
{
  public:
    Base(someType x) : myObject{x} {}
  protected:
    someType myObject;
}

class Child : public Base
{
  public:
    //constructor
    Child(someType x) : Base(x) {}
}

一般来说,一个班级应该负责初始化自己的成员。

答案 1 :(得分:1)

这里的问题是您在初始化列表中初始化继承的myObject。当创建派生类的对象时,在进入派生类的构造函数的主体之前,基类的构造函数被称为(默认情况下,如果基类具有默认或无参数构造函数,否则您必须显式调用初始化列表中的构造函数)

所以,当你执行:: Class Child:public someNamespace::Base时,你的基类的构造函数还没有被调用,这就是你的编译器抱怨的原因:: Child类没有一个名为myObject的字段,那就是你实际上是在尝试为尚未声明和定义的东西赋值!它将在构造函数Base类进入其执行后定义。

因此,您的Child类构造函数看起来像这样::

   Child(someType x) {
      myObject = x;
   }

工作ideone链接:: http://ideone.com/70kcdC

我在上面的答案中发现了这一点,所以我认为它可能真的有帮助!