知识点:
1.this指针指向对象自身
2.static静态成员变量
在类内声明,必须要在类外初始化
int Base3::base3 = 0;
3.由多基类继承而来的派生类构造时构造函数的调用
①先按继承基类的顺序调用基类的构造函数,有参传参,无参使用默认值,所以有
创建Base2 : 2
创建Base1 : 1
创建Base3 : 0
②初始化列表中形实参结合,创建Base1类型的number1和Base2类型的number2,自动创建number3,这里利用静态成员展示,表示是第二次创建,与第一次不同,这里形式参数和实际参数结合的顺序也是和类内私有成员函数的定义顺序一致,所以有
创建Base1 : 3
创建Base2 : 4
创建Base3 : 1
4.析构函数的执行
①先析构该派生类内自定义成员,顺序与成员被定义时顺序相反,即与构造函数调用顺序相反
析构Base3 :1
析构Base2 :4
析构Base1 :3
②再析构基类成员,顺序也与基类继承顺序相反
析构Base3 :0
析构Base1 :1
析构Base2 :2
注意:base3是静态成员,所以每次改变都会改变类内该变量的值,也就是无论创建多少个类的对象,静态成员只有一个副本,所以要看析构的是哪个对象,需要一个新的成员the_base3来记录
// 例7-5_派生类析构函数(多继承,含有嵌入对象)
#include<iostream>
using namespace std;
class Base1 {
public:Base1(int i) { base1 = i;cout << "创建Base1 : " << i << endl; }~Base1() { cout << "析构Base1 :" << this->base1 << endl; }
private:int base1;};class Base2 {
public:Base2(int i) {base2 = i;cout << "创建Base2 : " << i << endl;}~Base2() { cout << "析构Base2 :" << this->base2 << endl; }
private:int base2;
};class Base3 {
public:Base3() {cout << "创建Base3 : " << this->the_base3 << endl;base3++;}~Base3() { cout << "析构Base3 :" << this->the_base3 << endl; }
private:static int base3;int the_base3 = base3;
};int Base3::base3 = 0;
class Deriver :public Base2, public Base1, public Base3 {//派生新的类,注意基类继承而来的顺序
public:Deriver(int a, int b, int c, int d) :Base1(a), member2(d), member1(c), Base2(b) {}//注意基类名的个数与顺序,注意对象名的个数与顺序
private:Base1 member1;Base2 member2;Base3 member3;
};int main() {Deriver obj(1, 2, 3, 4);return 0;
}
// 输出
创建Base2 : 2
创建Base1 : 1
创建Base3 : 0
创建Base1 : 3
创建Base2 : 4
创建Base3 : 1
析构Base3 :1
析构Base2 :4
析构Base1 :3
析构Base3 :0
析构Base1 :1
析构Base2 :2