问题描述:

    在stackoverflower上发现的一个问题,觉得挺有意思,自己之前也没有注意到 

 

这里面的内容实在讨论在子类的初始化列表中,如果对子类的成员变量进行初始化,然后调用父类的构造函数,那么他们的执行顺序会是什么样的,话不多说,码来!

#include<iostream>
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

 

分析:虽然按照常理,在初始化列表中,初始化的顺序是他们被声明的顺序,但是在加入了的构造函数之后,就会先去对父类初始化,这也符合我们的认知,因为在集成体系中的调用顺序就是这样的,如果我们在子类的构造函数中不显示的调用父类的构造函数,那么结果并不会发生变化