假设我们有一个 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
构造函数,它初始化var1
中的成员变量具有 init
值的基类,然后使用 process()
初始化 a
和 b
成员变量> 函数,这取决于设置为 var1
的值。
请注意,为了使此代码正确,我们需要确保 Base(init)
在 a(process())
和 b(过程())
.
在 C++ 中假设上述初始化顺序将保持不变是否有效?或者我是否需要将 Derived
构造函数更改为以下内容以保证初始化顺序?
Derived(int init) : Base(init) {
a = process();
b = process();
}
最佳答案
顺序是有保证的,你什么都不用做。基在成员之前初始化(按照它们声明的顺序)。成员按照声明的顺序初始化 [class.base.init]/13 (注意:声明的顺序,不是 mem-initializers 在构造函数的初始化列表中出现的顺序!)。
您还可以依赖于以与初始化顺序完全相反的顺序销毁基础和成员......
关于c++ - 基类和派生类中类成员变量的初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55624077/