C++ FAQ for me

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

看下面的代码:

C++ FAQ for meC++ FAQ for me虚析构函数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

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月6日 下午2:23
下一篇 2023年2月6日 下午2:26

相关推荐