浅谈多态基类声明虚析构函数

通过学习我们了解到派生类对象是由积累部分和派生类不恨构成的,那么该派生类对象是如何被析构和够早的呢?

#include

using namespace::std;

class A{

public:

A(){

cout<<“A的构造函数被调用"<

~A(){   cout<<"A的析构函数被调用"<

class B:public A{

public:

B(){   cout<<"B的构造函数被调用"<<  endl;}

~B(){  cout<< "B的析构函数被调用" <

int main(){

B b;

return 0;}

输出结果

A的构造函数被调用

B的构造函数被调用

B的析构函数被调用

A的析构函数被调用

可以看到:构造一个派生类对象的时候,先调用基类的构造函数,再调用派生类的构造函数,析构一个派生类对象的时候,先调用派生类的析构函数,再调用基类的析构函数。

上述内容讲述的是普通派生类的构造和析构过程,对于具有虚函数的派生类的构造和析构过程是怎样的呢?此时基类的析构函数没有声明称virtual

#include

using namespace::std;

class A{

public:

A(){

cout<<“A的构造函数被调用"<

~A(){   cout<<"A的析构函数被调用"<

virtual do(){ cout<<"a can do sth;"<

class B:public A{

public:

B(){   cout<<"B的构造函数被调用"<<  endl;}

~B(){  cout<< "B的析构函数被调用"

virtual do(){ cout<<"b can do anything ;"<

int main(){

A *a=new B;

delete a;

return 0;}

运行结果如下

A的构造函数被调用

B的构造函数被调用

A的析构函数被调用

可以看到,当通过A类型的指针来deleteB类型的对象时,只调用了A的析构函数,所以这个对象的派生部分的内存并没有被释放,从而造成内存泄露。

所以:当基类中包含有虚函数的时候,析构函数一定要写成虚析构函数,否则会造成内存泄露。

你可能感兴趣的:(浅谈多态基类声明虚析构函数)