文章目录
- 构造
- 析构
构造
- 如果子类构造函数没有显式指明基类部分(基类子对象)的初始化方式,那么编译器将会自动调用基类的无参构造函数来初始化基类子对象
- 如果希望以有参的方式来初始化基类部分,那么必须使用初始化列表来显式指明
- 子对象构造顺序
- 分配内存
- 构造基类子对象(按继承表顺序)
- 构造成员子对象(按声明顺序)
- 执行子类构造函数代码
#include<iostream>usingnamespacestd;classMember{private:intm_k;public:Member(){cout<<"Member()"<<endl;m_k=0;}Member(intk){cout<<"Member(int)"<<endl;m_k=k;}};classBase{private:intm_i;public:Base(){cout<<"Base()"<<endl;m_i=0;}Base(inti){cout<<"Base(int)"<<endl;m_i=i;}};classDerived:publicBase{private:intm_j;Member m_m;public:Derived():Base(100),m_m(200){cout<<"Derived()"<<endl;}Derived(inti,intj):Base(i){cout<<"Derived(int, int)"<<endl;m_j=j;}};intmain(void){Derived d1;Derivedd2(1,2);return0;}析构
- 子类的析构函数,无论自己定义的,还是编译器缺省提供,都会自动调用基类的析构函数,完成基类子对象的销毁。
- 子类对象销毁过程
- 执行子类析构函数代码
- 析构成员子对象(按声明逆序)
- 析构基类子对象(按继承表逆序)
- 释放内存
#include<iostream>usingnamespacestd;classMember{private:intm_k;public:Member(){cout<<"Member()"<<endl;m_k=0;}Member(intk){cout<<"Member(int)"<<endl;m_k=k;}~Member(){cout<<"~Member()"<<endl;}};classBase{private:intm_i;public:Base(){cout<<"Base()"<<endl;m_i=0;}Base(inti){cout<<"Base(int)"<<endl;m_i=i;}~Base(){cout<<"~Base()"<<endl;}};classDerived:publicBase{private:intm_j;Member m_m;public:Derived():Base(100),m_m(200){cout<<"Derived()"<<endl;}Derived(inti,intj):Base(i){cout<<"Derived(int, int)"<<endl;m_j=j;}~Derived(){cout<<"~Derived()"<<endl;}};intmain(void){Derived d1;//Derived d2(1,2);return0;}