C++ | 构建子类,初始化父类(构造函数和析构函数的执行顺序)
构造函数顺序
假如有一个父类A(基类),一个的子类B,公有继承于A,当在测试文件(main函数)里,定义一个子类对象d,d对象的初始化会调用d的构造函数,但d对象的构造函数要想完成初始化必须先初始化父类的,因为子类B继承于A,A类的成员函数都被B继承过去了,所以完成初始化子类对象d必须先调用A(父类)的构造函数。
析构函数顺序
析构函数调用顺序其实和栈的原理类似,都是是先进后出原则,当创建子对象d时,会先执行父类构造函数,然后执行子类的构造函数。最后函数结束释放内存的时候,就会先执行子类的析构函数,然后才是父类的。
class Base1 {
public:
Base1(){
cout << "调用了Base的默认构造函数" << endl;
}
Base1(int b ,int d) {
cout << "调用了带两个参数的Base的构造函数" << endl;
}
Base1(int b) {
cout << "调用了带一个参数的Base的构造函数" << endl;
}
~Base1() {
cout << "调用了Base的析构函数" << endl;
}
};
class Derived1 :public Base1{
public:
Derived1() {
cout << "调用了Derived1的默认构造函数" << endl;
}
Derived1(int b, int d) {
cout << "调用了带两个参数的Derived1构造函数" << endl;
};
~Derived1() {
cout << "调用了Derived1的析构函数" << endl;
}
};
int main()
{
Base1 b1;
Base1 b2(10);
Base1 b3(10,20);
cout<<"==========="<<endl;
Derived1 d1;
Derived1 d2(1,2);
cout<<"================="<<endl;
return 0;
}
运行结果:
总结:
构造子类时,先执行父类的构造函数,然后执行子类的构造函数。
析构子类时,先执行子类的析构函数,然后执行父类的析构函数。