首页 > 编程知识 正文

析构函数可以是纯虚函数吗,析构函数有什么用

时间:2023-05-03 06:19:27 阅读:27188 作者:2827

析构函数的示例代码(常规析构函数)问题原因分析与修正代码(虚拟析构函数)相关的问题构造函数可以是虚函数吗? 什么时候需要虚析函数?

示例代码(普通析构函数) ) ) ) ) ) )。

像往常一样,先看看下面的代码吧。

class base { public : base (int data ) : ma (data ) { cout 'Base ) endl; }~Base (() cout ) }~Base () ) ) endl; } voidshow ((cout ' call base :3360 show ) ) ) ' endl; }private:int ma; (; class derive 3360 public base { public : derive (int data ) :base(data ),MB (data ) {cout 'Derive ) ) ' endl; }~Derive () cout ) }~Derive () ) ) ) endl; }private:int mb; (; int main () base * Pb=新驱动) ) 10; pb-show (; delete pb; 返回0; }如果有问题,先看看执行结果。

发现问题了吗?

~驱动(缺失! 也就是说,派生类的析构函数根本没有运行!

那样的话,就有内存泄漏的问题。

原因分析为什么不调用派生类的析构函数呢?

因为我们使用基类指针,指向通过堆积new而出现的派生类对象。

基类析构函数是常规函数,在函数调用过程中发生了静态绑定

也就是说,在编译过程中,编译器会确定调用析构函数的地址只能是基类的析构函数

派生类的析构函数没有机会运行。

通过修改代码(虚拟析构函数)分析原因,发现调用析构函数时必须发生动态绑定。 否则派生类的析构函数将无法调用。 因此,修改代码如下。

class base { public : base (int data ) : ma (data ) { cout 'Base ) endl; }virtual ~Base () cout ()~base () ) ) ) endl; }virtual void show () ({ cout 'call Base:show ) ) ' endl; }private:int ma; (; class derive 3360 public base { public : derive (int data ) :base(data ),MB (data ) {cout 'Derive ) ) ' endl; }~Derive () cout ) }~Derive () ) ) ) endl; }private:int mb; (; int main () base * Pb=新驱动) ) 10; pb-show (; delete pb; 返回0; 此时,我们再次运行程序:

现在,可以正确分析派生类中的对象了。

当然,虚拟析构函数存在很多问题:

构造函数可以是虚函数吗? 要回答这个问题,你需要知道虚函数依赖什么。

首先,虚函数可以生成地址并存储在vftable中,

其次,虚函数必须依赖于对象。 换句话说,对象必须存在。

由于只存在对象,因此可以通过对象的虚函数指针vfptr访问只读数据区域的vftable来获得虚函数的地址。

分析到此,可以得出构造函数不能是虚函数;

因为调用构造函数时,还没有对象!

什么时候需要虚析函数? 当基类指针(请参见)指向从堆上的new中发出的派生类对象时

基类指针(delete pb )调用析构函数时,必须发生动态绑定;

派生类的析构函数将无法调用。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。