我有这样的事情:
Class Base
{
public:
Base();
protected:
someType myObject;
}
Class Child:public someNamespace::Base
{
//constructor
Child(someType x):myObject(x){}
}
Class Child和Base有2个不同的命名空间...... 编译器抱怨我的Child类没有名为myObject的字段
任何人都知道为什么?是因为从子构造函数填充Base成员是非法的吗?
由于
答案 0 :(得分:3)
您无法像这样初始化继承的成员。相反,您可以为基类提供一个构造函数来初始化该成员,然后派生类可以调用该构造函数。
class Base
{
public:
Base(someType x) : myObject{x} {}
protected:
someType myObject;
}
class Child : public Base
{
public:
//constructor
Child(someType x) : Base(x) {}
}
一般来说,一个班级应该负责初始化自己的成员。
答案 1 :(得分:1)
这里的问题是您在初始化列表中初始化继承的myObject
。当创建派生类的对象时,在进入派生类的构造函数的主体之前,基类的构造函数被称为(默认情况下,如果基类具有默认或无参数构造函数,否则您必须显式调用初始化列表中的构造函数)。
所以,当你执行:: Class Child:public someNamespace::Base
时,你的基类的构造函数还没有被调用,这就是你的编译器抱怨的原因:: Child类没有一个名为myObject的字段,那就是你实际上是在尝试为尚未声明和定义的东西赋值!它将在构造函数Base
类进入其执行后定义。
因此,您的Child
类构造函数看起来像这样::
Child(someType x) {
myObject = x;
}
工作ideone链接:: http://ideone.com/70kcdC
我在上面的答案中发现了这一点,所以我认为它可能真的有帮助!