使用初始化列表 (C) 初始化父级的受保护成员

新手上路,请多包涵

是否可以使用子类的构造函数的初始化列表来初始化在父类中声明为受保护的数据成员?我无法让它工作。我可以解决它,但如果我不必这样做会很好。

一些示例代码:

 class Parent
{
protected:
    std::string something;
};

class Child : public Parent
{
private:
    Child() : something("Hello, World!")
    {
    }
};

当我尝试这个时,编译器告诉我:“类’Child’没有任何名为’something’的字段”。这样的事情可能吗?如果是这样,语法是什么?

非常感谢!

原文由 Stephen 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 552
2 个回答

按照你描述的方式是不可能的。您必须向基类添加一个构造函数(可能受到保护)才能转发它。就像是:

 class Parent
{
protected:
    Parent( const std::string& something ) : something( something )
    {}

    std::string something;
}

class Child : public Parent
{
private:
    Child() : Parent("Hello, World!")
    {
    }
}

原文由 philsquared 发布,翻译遵循 CC BY-SA 2.5 许可协议

正如@philsquared 所说,您不能从孩子的成员初始化列表中初始化父类的成员,但您可以添加一个父类构造函数,并从孩子的成员初始化列表中调用此构造函数。

而且正如@dirkgently 所说,之所以不能在初始化列表中初始化父类的成员,是因为此时还没有调用父类的构造函数,所以这些字段不可用。

对于后人,我还想指出,如果您不想为父类编写构造函数,则可以在构造函数的主体中初始化受保护的成员:

 class Child : public Parent
{
private:
    Child() {
        something = "Hello, World!";
    }
};

原文由 Daniel C Jacobs 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题