是否可以使用子类的构造函数的初始化列表来初始化在父类中声明为protected的数据成员?我无法让它发挥作用.我可以解决它,但如果我不必这样做会很好.
一些示例代码:
class Parent
{
protected:
std::string something;
};
class Child : public Parent
{
private:
Child() : something("Hello, World!")
{
}
};
Run Code Online (Sandbox Code Playgroud)
当我尝试这个时,编译器告诉我:"类'Child'没有任何名为'something'的字段".这样的事情可能吗?如果是这样,语法是什么?
非常感谢!
为什么我不能这样做?
class A
{
public:
int a, b;
};
class B : public A
{
B() : A(), a(0), b(0)
{
}
};
Run Code Online (Sandbox Code Playgroud) 我有一个关于在派生类的构造函数中初始化继承成员的问题.示例代码:
class A
{
public:
int m_int;
};
class B: public A
{
public:
B():m_int(0){}
};
Run Code Online (Sandbox Code Playgroud)
这段代码给了我以下输出:
In constructor 'B::B()':
Line 10: error: class 'B' does not have any field named 'm_int'
(见http://codepad.org/tn1weFFP)
我猜这是为什么会这样?m_int应该是on的成员B,并且A当m_intin的初始化B发生时,父类应该已经被初始化(因为父构造函数在继承类的成员初始化之前运行).我的推理错在哪里?这段代码到底发生了什么?
EDIT:我知道初始化这个成员的其他可能性(基础构造函数或派生构造函数中的赋值),但我想理解为什么它在我尝试的方式中是非法的?一些特定的C++语言功能还是这样的?如果可能的话,请指出C++标准的段落.