通过学习我们了解到派生类对象是由积累部分和派生类不恨构成的,那么该派生类对象是如何被析构和够早的呢?
#include <iostream>
using namespace::std;
class A{
public:
A(){
cout<<“A的构造函数被调用"<<endl;}
~A(){ cout<<"A的析构函数被调用"<<endl;} };
class B:public A{
public:
B(){ cout<<"B的构造函数被调用"<< endl;}
~B(){ cout<< "B的析构函数被调用" <<endl;} };
int main(){
B b;
return 0;}
输出结果
A的构造函数被调用
B的构造函数被调用
B的析构函数被调用
A的析构函数被调用
可以看到:构造一个派生类对象的时候,先调用基类的构造函数,再调用派生类的构造函数,析构一个派生类对象的时候,先调用派生类的析构函数,再调用基类的析构函数。
上述内容讲述的是普通派生类的构造和析构过程,对于具有虚函数的派生类的构造和析构过程是怎样的呢?此时基类的析构函数没有声明称virtual
#include
using namespace::std;
class A{
public:
A(){
cout<<“A的构造函数被调用"<
~A(){ cout<<"A的析构函数被调用"<<endl;}
virtual do(){ cout<<"a can do sth;"<<endl;}};
class B:public A{
public:
B(){ cout<<"B的构造函数被调用"<< endl;}
~B(){ cout<< "B的析构函数被调用" <endl;}
virtual do(){ cout<<"b can do anything ;"<<endl;
int main(){
A *a=new B;
delete a;
return 0;}
运行结果如下
A的构造函数被调用
B的构造函数被调用
A的析构函数被调用
可以看到,当通过A类型的指针来deleteB类型的对象时,只调用了A的析构函数,所以这个对象的派生部分的内存并没有被释放,从而造成内存泄露。
所以:当基类中包含有虚函数的时候,析构函数一定要写成虚析构函数,否则会造成内存泄露。