在基类和派生类中初始化类成员变量

时间:2019-04-11 03:05:00

标签: c++ c++11

让我们说我们有一个Base类和一个Derived类:

class Base {

  public:

    Base(int x) : var1(x)

    int process(){
       //return some function of var1
    }

  protected:
    int var1;

}

class Derived : public Base {

  Derived(int init) : Base(init), a(process()), b(process()) {}

  protected:

    int a;
    int b;


}

换句话说,当我们初始化Derived时,我们假设首先调用Base构造函数,该构造函数使用{{1}初始化基类中的var1成员变量。 }值,然后使用init函数初始化ab成员变量,该函数取决于设置为process()的值。

请注意,为了使此代码正确,我们需要确保在var1Base(init)之前调用a(process())

在C ++中假设将维持上述初始化顺序是否有效?还是我需要将b(process())构造函数更改为以下内容以保证初始化的顺序?

Derived

1 个答案:

答案 0 :(得分:4)

订单得到保证,您无需执行任何操作。基础在成员之前进行初始化(按照声明的顺序)。成员以声明[class.base.init]/13的顺序进行初始化(注意:声明顺序,不是 mem-initializers 出现在构造函数的顺序)初始化列表!)。

您还可以依靠以与初始化顺序完全相反的顺序破坏基础和成员……