首先我们看一段代码:
class A{
public:
A(){ cout << "构造A " << endl; }
~A(){ cout << "析构A " << endl; }
};
class B:public A{
public:
B(){ cout << "构造B " << endl; }
~B(){ cout << "析构B " << endl; }
};
void test()
{
B b;
}
上面这就是很简单的类B继承类A,然后定义一个B的对象。
结果:
这个地方为什么先构造A,再构造B。但是先析构子类B,再析构父类A呢?
上面是简单的情况,当父类中包含数据num,且被子类使用时,就知道为什么后构造先析构了。
此时若A中有数据num,B类的构造和析构都用到了这个数据num:
class A{
public:
A(){ cout << "构造A " << endl; }
~A(){ cout << "析构A " << endl; }
int num;
};
class B:public A{
public:
B(){ cout << num << endl; cout << "构造B " << endl; }
~B(){ cout << num << endl; cout << "析构B " << endl; }
};
- 此时B的构造函数若想使用num这个数据,那么类A肯定就要提前构造出来,所以先构造A,再构造B;
- 反观析构时,因为B要使用类A的数据,如果A先被析构了,那么B就无法调用这个数据,因此就需要先析构B再析构A,保证安全
同理,如果过类中包含其他类定义的对象,那么也是:
- 先构造父类,包含类,子类
- 先析构子类,包含类,父类
如下:
结果:
代码:
#include<iostream>
using namespace std;
class C
{
public:
C(){ cout << "构造包含类C " << endl; }
~C(){ cout << "析构包含类C " << endl; }
};
class A{
public:
A(){ cout << "构造父类A " << endl; }
~A(){ cout << "析构父类A " << endl; }
};
class B:public A{
public:
B(){cout << "构造子类B " << endl; }
~B(){cout << "析构子类B " << endl; }
C c;
};
void test()
{
B b;
}
int main()
{
test();
system("pause");
return 0;
}