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

C++populating base class protected member using derived class constructor

本文关键字:基类 受保护 成员 填充 构造函数 派生      更新时间:2023-10-16

我有这样的东西:

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

类Child和Base在两个不同的命名空间…编译器报错我的子类没有myObject

字段

有人知道为什么吗?是因为从子构造函数中填充基成员是非法的吗?

谢谢

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

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

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

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

所以,当你做::Class Child:public someNamespace::Base你的基类的构造函数还没有被调用,这就是为什么你的编译器抱怨::子类没有一个名为myObject的字段,那就是你实际上是在尝试分配一个值给一些还没有被声明和定义!它将在Base类的构造函数进入其执行后被定义。

那么,您的Child类构造函数将看起来像这样::

   Child(someType x) {
      myObject = x;
   }

Working ideone link:: http://ideone.com/70kcdC

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