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就不会有这个问题了。