C++ FAQ for me

1. 为什么需要虚析构函数,什么时候需要?

看下面的代码:

 

虚析构函数
class  ClxBase
{
public :
    ClxBase() {};
    
virtual   ~ ClxBase() {cout << "Output from the destructor of class ClxBase!" << endl;};

    
virtual   void  DoSomething() { cout  <<   " Do something in class ClxBase! "   <<  endl; };
};

class  ClxDerived :  public  ClxBase
{
public :
    ClxDerived() {};
    
~ ClxDerived() { cout  <<   " Output from the destructor of class ClxDerived! "   <<  endl; }; 

    
void  DoSomething() { cout  <<   " Do something in class ClxDerived! "   <<  endl; };
};

 

代码:

ClxBase  * pTest  =   new  ClxDerived;
pTest
-> DoSomething();
delete pTest;

的输出结果是

Do something in class ClxDerived!
Output from the destructor of class ClxDerived!

Output from the destructor of class ClxBase!
如果把类ClxBase析构函数前的virtual去掉,那输出结果就是下面的样子了:
Do something in class ClxDerived!

Output from the destructor of class ClxBase!

为什么ClxDerived的析构函数没有调用呢? pTest的动态类型是ClxDerived,但是静态类型是ClxBase. 如果ClxBase的析构函数不加virtual,当调用 delete pTest时, 系统会只调用ClxBase的析构函数,而ClxDerived的析构函数不会被调用。

当然了如果delete后面的指针的静态类型如果是ClxDerived就不会有这个问题了。

 

你可能感兴趣的:(C++)