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

C++ C++;使用派生类构造函数填充基类受保护的成员,c++,inheritance,C++,Inheritance,我有这样的想法: Class Base { public: Base(); protected: someType myObject; } Class Child:public someNamespace::Base { //constructor Child(someType x):myObject(x){} } 类子类和基类位于两个不同的名称空间中。。。 编译器抱怨我的子类没有名为myObject的字段 有人知道为什么吗?是否因为从子构造函数填充基成员

我有这样的想法:

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

Class Child:public someNamespace::Base
{
   //constructor
   Child(someType x):myObject(x){}
}
类子类和基类位于两个不同的名称空间中。。。 编译器抱怨我的子类没有名为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
基类的构造函数尚未调用,这就是编译器抱怨::Child类没有名为myObject的字段的原因,也就是说,您实际上在尝试为尚未声明和定义的对象赋值!它将在
Base
类的构造函数进入其执行后定义

因此,您的
子类构造函数将如下所示:

   Child(someType x) {
      myObject = x;
   }
工作表意文字链接::


我发现上面的答案中缺少这一点,所以我认为它实际上可能会有所帮助

好的,有道理。我会试试看。Thanks@Telenoobies:如果仅在基类内访问
myObject
,则还应将其设置为
private
。还可以将该基类构造函数设置为受保护的
,以便只有派生类才能调用它。是否将
子类
构造函数更改为
子类(someType x):someNamespace::base(x){}
?是的。。。。基类可以有2个构造函数,对吗?一个为空,另一个为someType参数。它们看起来是这样的:类Base{public:Base::Base();Base::Base(SomeType x);}好的,您说“当您这样做时::Class Child:public sometnamespace::Base基类的构造函数还没有被调用”解决此问题的方法是在子构造函数中执行赋值,而不是在子构造函数的初始化列表中执行赋值?@telenobies:是的,因为当您进入子构造函数体时,您的基类成员已经创建,因为基类构造函数已经完成了它的执行,然后定义
myObject
。当您在初始化列表中初始化时,基类对象尚未创建,这就是为什么错误显示子类没有名为myObject的字段