使用构造函数初始化列表初始化基类的元素

时间:2013-10-16 13:57:52

标签: c++ oop inheritance

据我了解,当我在派生类初始化列表中初始化基类时,会立即构造基类,然后基类元素应该可用。如果这是对的,为什么这不起作用?

class Base
{
public:
  int elem;
}

class Derived : public Base
{
  Derived() : Base(), elem(1) {}
  // error: class 'Derived' does not have any field named 'elem'
}

注意:在我的情况下,我无法Base进行任何更改(这是一个固定的接口类)。

5 个答案:

答案 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;
  }
};