为什么析构函数是虚函数比较好?

析构函数设置为虚函数是为了确保基类指针在操作派生类对象时,能正确调用派生类的析构函数,完成完整的内存释放。否则,仅调用基类析构函数会导致派生类资源未被正确释放,影响内存管理。此外,虚函数还实现了多态调用,允许基类指针调用派生类的同名成员函数。
摘要由CSDN通过智能技术生成

 

原因:基类对象的指针操作派生类对象时,防止析构函数只调用基类的,而不调用派生类的

 

下面详细说明:

//基类
 
class A{
   public :
       A(){ cout<<"A构造函数"<<endl; }
       ~A(){cout<<"A被销毁了"<<endl;}
       void Do(){
           cout<<"A要做点什么"<<endl;
       }
};
//派生类
 
class B :public A{
    public :
        B(){ cout<<"B构造函数"<<endl;}
        ~B(){ cout<<"B被销毁了"<<endl;}
        void Do(){ cout<<"B要做点什么"<<endl;}
};

 

(1)派生类 指针=new 派生类;

         B      *p   =new B;      那么就会执行基类构造函数,派生类构造函数

         p->Do();   通过派生类指针可以调用派生类的成员函数

         delete p;     先调用派生类析构函数,在调用基类构造函数

         

#include<iostream>
析构函数是一个在基类中定义的虚函数,它在继承类对象销毁时被调用。用 `virtual` 关键字声明的析构函数就是虚析构函数。 需要虚析构函数的原因是当一个基类指针指向一个派生类对象时,如果基类中的析构函数不是虚函数,那么在删除基类指针时,只会调用基类的析构函数,而不会调用派生类的析构函数,导致派生类对象的内存空间没有被正确释放,从而导致内存泄漏。 举个例子,假设有一个基类 `Animal` 和一个派生类 `Dog`,它们都有一个 `DoSomething` 函数和一个析构函数。如果 `Animal` 的析构函数不是虚函数,那么在使用基类指针删除 `Dog` 对象时,只会调用 `Animal` 的析构函数,而不会调用 `Dog` 的析构函数,导致 `Dog` 对象的内存没有被正确释放。 因此,为了确保在使用基类指针指向派生类对象时能够正确调用派生类的析构函数,需要在基类中声明虚析构函数。这样,在使用基类指针删除派生类对象时,会首先调用派生类的析构函数,然后再调用基类的析构函数,从而正确释放对象的内存空间。 以下是一个基类和派生类的示例代码,演示了虚析构函数的用法: ```cpp class Animal { public: virtual ~Animal() { cout << "Animal 被销毁" << endl; } virtual void DoSomething() { cout << "Animal 看看周围" << endl; } }; class Dog : public Animal { public: ~Dog() { cout << "Dog 被销毁" << endl; } void DoSomething() { cout << "Dog 摇摇尾巴" << endl; } }; ``` 在上面的代码中,`Animal` 类中的析构函数被声明为虚析构函数,而 `Dog` 类中的析构函数重载了 `Animal` 类的虚析构函数。这样,当使用基类指针指向 `Dog` 类对象并使用 `delete` 运算符删除该指针时,首先会调用 `Dog` 类的析构函数,然后再调用 `Animal` 类的析构函数,从而正确释放对象的内存空间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值