问题描述:
在stackoverflower上发现的一个问题,觉得挺有意思,自己之前也没有注意到
这里面的内容实在讨论在子类的初始化列表中,如果对子类的成员变量进行初始化,然后调用父类的构造函数,那么他们的执行顺序会是什么样的,话不多说,码来!
using namespace std;
class parent {
int a;
public:
parent() :a(123) {
cout << "parent constructor is called\n";
}
};
class A {
public:
A(int a) { cout << a<<"A constructor is called\n"; }
};
class son : parent
{
A a2;
A a1;
public:
son() :a1(2),a2(3), parent()
{
cout << "son constructor is callede\n";
}
};
int main()
{
son s;
system("pause");
return 0;
}
运行结果
parent constructor is called
3A constructor is called
2A constructor is called
son constructor is callede
分析:虽然按照常理,在初始化列表中,初始化的顺序是他们被声明的顺序,但是在加入了的构造函数之后,就会先去对父类初始化,这也符合我们的认知,因为在集成体系中的调用顺序就是这样的,如果我们在子类的构造函数中不显示的调用父类的构造函数,那么结果并不会发生变化