- 为什么需要虚析构函数,什么时候需要?
看下面的代码:
虚析构函数classClxBase
{
public:
ClxBase() {};
virtual~ClxBase() {cout<<"Output from the destructor of class ClxBase!"<<endl;};
virtualvoidDoSomething() { cout<<"Do something in class ClxBase!"<<endl; };
};
classClxDerived :publicClxBase
{
public:
ClxDerived() {};
~ClxDerived() { cout<<"Output from the destructor of class ClxDerived!"<<endl; };
voidDoSomething() { cout<<"Do something in class ClxDerived!"<<endl; };
};
代码:ClxBase*pTest=newClxDerived;
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就不会有这个问题了。
原文链接: https://www.cnblogs.com/whyandinside/archive/2010/01/02/1638020.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/6246
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!