调用原则:
- 子类对象在创建时会首先调用父类的构造函数
- 父类构造函数执行完毕后,才会调用子类的构造函数
- 当父类构造函数有参数时,需要在子类初始化列表(参数列表)中显示调用父类构造函数
- 析构函数调用顺序和构造函数相反
1.顺序
1.1 子类创建对象时,先调用父类的构造,然后调用自身构造
1.2 析构顺序与构造顺序相反
#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; class Base { public: Base() { cout << "Base默认构造函数调用" << endl; } ~Base() { cout << "Base析构" << endl; } }; class Son : public Base { public: Son() { cout << "Son默认构造函数" << endl; } ~Son() { cout << "Son析构" << endl; } }; void test01() { Son s; } int main() { test01(); //父构->子构->子析->父析 system("Pause"); return 0; }
结果:
2.子类是不会继承父类的构造函数和析构函数
父类没有默认构造函数,子类也不能有
补充内容,如果父类中没有合适默认构造,那么子类可以利用初始化列表的方式显示的调用父类的其他构造
class Base2 { public: Base2(int a) { this->m_A = a; cout << "Base2有参构造" << endl; } int m_A; }; class Son2 : public Base2 { public: //Son2(){} // 因为父类中没有默认构造函数了 所以会报错 Son2(int a) : Base2(a) //利用初始化列表的方式 显示调用 传值给父类有参构造 { } }; void test02() { Son2 s2(10); cout << s2.m_A << endl; }
结果: