让我们说我们有一个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
函数初始化a
和b
成员变量,该函数取决于设置为process()
的值。
请注意,为了使此代码正确,我们需要确保在var1
和Base(init)
之前调用a(process())
。
在C ++中假设将维持上述初始化顺序是否有效?还是我需要将b(process())
构造函数更改为以下内容以保证初始化的顺序?
Derived
答案 0 :(得分:4)
订单得到保证,您无需执行任何操作。基础在成员之前进行初始化(按照声明的顺序)。成员以声明[class.base.init]/13的顺序进行初始化(注意:声明顺序,不是, mem-initializers 出现在构造函数的顺序)初始化列表!)。
您还可以依靠以与初始化顺序完全相反的顺序破坏基础和成员……