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

3
假设我们有一个基类(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 构造函数,该函数使用 init 值初始化基类中的 var1 成员变量,然后使用依赖于设置为 var1 的值的 process() 函数来初始化 ab 成员变量。
请注意,为了使此代码正确,我们需要确保在调用 a(process())b(process()) 之前先调用 Base(init)
在 C++ 中,假设上述初始化顺序被保持是有效的吗?或者我需要更改 Derived 构造函数如下才能保证初始化顺序?
Derived(int init) : Base(init) {

  a = process();
  b = process();
}

1
不,你不需要做任何这样的事情。 - n. m.
1个回答

4
订单已经得到保证,您不需要做任何事情。在成员初始化之前,基类会被初始化(按照声明的顺序)。成员初始化的顺序是按照它们的声明顺序[class.base.init]/13(注意:按声明的顺序,而不是构造函数初始化列表中的mem-initializers的顺序!)。
此外,您还可以依赖于基类和成员的销毁顺序与它们初始化时的顺序完全相反...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接