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

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

一些示例代码:

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中的名称,如果在该范围内没有find,则在包含构造函数定义的作用域中查找。 [注意:如果构造函数的类包含一个与该类的直接或虚拟基类同名的成员,则命名成员或基类并由一个标识符组成的mem-initializer-id引用类成员。 隐藏基类的meminitializer-id可以使用限定名称来指定。 -end note] 除非mem-initializer-id命名构造函数的类,构造函数类的非静态数据成员或该类的直接或虚拟基础,否则mem-initializer是格式不正确的。

注意:强调我的。

无法在派生类构造函数初始化列表中初始化父类的成员。 无论他们是受保护的,公共的还是其他的都没关系。

在你的例子中,member是Parent类的成员,这意味着它只能在Parent类的构造函数初始化列表中初始化。

也许你可以用这样的方式尝试使用关键字“using”

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