析构函数是否要声明为虚函数

如果是派生类继承基类,且存在基类指针指向派生类对象,那么析构函数应该声明成虚函数。

如果析构函数不是虚函数,指向派生类对象的基类指针,在销毁对象时,会调用基类的构造函数,而不会调用派生类的析构函数,可能会造成内存或资源泄漏。
为什么这样会调用基类的构造函数?因为,如果析构函数不是虚函数,析构时,实际调用的函数,在编译期间会被确定为指针类型类的析构函数,即基类的析构函数。

如析构函数是虚函数,指向派生类对象的基类指针,在销毁对象时,会调用派生类的析构函数,派生类的析构函数又自动调用基类的析构函数,这样可以避免内存泄漏。
为什么这样会调用派生类的构造函数?因为,声明成虚函数的析构函数,析构时,实际执行的函数的地址,在编译期间不确定,在运行时,才根据虚表指针和虚函数表计算出析构时实际执行的函数地址,即派生类的析构函数地址。
为什么这样计算出的是派生类的析构函数地址呢?因为虚表指针指针是每个派生类对象都拥有的,且指向派生类的虚函数表,派生类的虚函数表中又存放着声明为虚函数的析构函数的地址。

那是不是,所有类的析构函数都要声明成虚函数呢?不是的,如果一个类没有派生类,或者,这个类是基类,有派生类,但是不会出现基类指针指向派生类对象的情况,那这个类的析构函数,就没必要声明成虚函数。如果声明成了虚函数,在析构时,会多了查虚函数表的过程,而且内存中也要多维护虚函数表和虚表指针,会增大开销。

posted @   enbug  阅读(147)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示