据我了解,当我在派生类初始化列表中初始化基类时,会立即构造基类,然后基类元素应该可用。如果这是对的,为什么这不起作用?
class Base
{
public:
int elem;
}
class Derived : public Base
{
Derived() : Base(), elem(1) {}
// error: class 'Derived' does not have any field named 'elem'
}
注意:在我的情况下,我无法对Base
进行任何更改(这是一个固定的接口类)。
答案 0 :(得分:2)
构造函数只能构造自己的类的成员。您需要为Base
提供合适的构造函数:
class Base
{
public:
Base() : elem(23) { }
int elem;
protected:
Base(int n) : elem(n) { }
};
class Derived : public Base
{
Derived() : Base(1) {}
};
答案 1 :(得分:2)
初始化列表用于初始化该类的直接成员和基础子对象,而不是基类的成员。基类成员由基类构造函数初始化,您不能初始化任何两次。
如果您想在初始化后重新分配基类成员,那么您可以:
Derived() : Base() {elem = 1;}
或者您可以允许将值传递给基类的构造函数:
explicit Base(int e) : elem(e) {}
Derived() : Base(1) {}
虽然您在问题中添加的注释表明在您的特定情况下这不是一种选择。
答案 2 :(得分:0)
elem属于Base类,因此Base负责初始化它。
正确的代码如下所示:
class Base
{
public:
int elem;
Base(int n) : elem(n) {}
};
class Derived : public Base
{
Derived() : Base(1) {}
};
答案 3 :(得分:0)
您只能在初始化列表NOT基类成员中初始化类和基类的成员。
如果要覆盖基类成员的值,请在构造函数的主体中执行。
答案 4 :(得分:0)
在这种情况下,您无法在初始化列表中初始化elem,而必须在函数体中初始化它。
class Base {
public:
int elem;
};
class Derived : public Base {
public:
Derived() : Base() {
elem = 1;
}
};