如何用初始化列表初始化父保护成员(C ++)?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (20)

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

一些示例代码:

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

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

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

提问于
用户回答回答于

用你描述的方式是不可能的。你必须添加一个构造函数(可以被保护)到基类来转发它。就像是:

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

    std::string something;
}

class Child : public Parent
{
private:
    Child() : Parent("Hello, World!")
    {
    }
}
用户回答回答于

当编译器遇到初始化器列表时,派生类对象还没有形成。直到那时,基类构造函数才被调用。只有在基类构造函数被调用后something才会出现。因此,这个问题。如果不显式调用基类构造函数,编译器会为你执行此操作(通过为基类生成相应的简单构造函数)。这会导致该something成员被默认初始化。

从C ++ 0x草案:

12.6.2初始化基础和成员 2在构造函数的类的范围内查找mem-initializer-id中的名称,如果未在该范围内找到,则在包含构造函数定义的范围中查找。[注意:如果构造函数的类包含与该类的直接或虚拟基类同名的成员,则命名成员或基类并由单个标识符组成的mem-initializer-id引用类成员。隐藏基类的meminitializer-id可以使用限定名称指定。-end note] 除非mem-initializer-id命名构造函数的类,构造函数类的非静态数据成员或者该类的直接或虚拟基础,否则mem初始化器不合格。 注意:强调我的。

扫码关注云+社区