C++析构函数前加上virtual的原因

本文深入探讨C++中虚析构函数的作用及其实现多态的重要性,通过实例说明如何避免内存泄漏,强调基类析构函数使用virtual关键字进行动态绑定的必要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

class A

{

    public:

        virtual void print(){cout<<"This is A"<<endl;}

};

class B : public A

{

    public:

    void print(){cout<<"This is B"<<endl;}

}

虚函数:指向基类指针在操作它的多态类对象时,会根据不同的类对象,调用其相应的函数,实现动态绑定

C++析构函数加上virtual是为了防止内存泄漏。(假设基类中采用的是非虚析构函数,当删除基类指针指向的派生类对象时就不会触发动态绑定,因而只会调用基类的析构函数,而不会调用派生类的析构函数。那么在这种情况下,派生类中申请的空间就得不到释放从而产生内存泄漏。所以,为了防止这种情况的发生,C++中基类的析构函数应采用virtual虚析构函数。)

用在C++实现多态的时候,其基类要加virtual,就可以绑定派生函数的析构函数。


原因跟动态绑定有关,大家都知道,多态是通过虚函数实现的,而虚函数又是通过动态绑定实现的。

先举个例子:

class Base
{
    public:
    virtual void function()
    {
        cout<<"this is Base's function"<<endl;
    }        
    
    virtual ~Base()
    {
        cout<<"this is Base's destroy"<<endl;
    }
};

class Derived:public Base
{
    public:
    void function()
    {
        cout<<"this is Derived's function"<<endl;
    }
    
    ~Derived()
    {
        cout<<"this is Derived's destroy"<<endl;
    }
};

int main()
{
    Base *ptr = new Derived();
    ptr->function();
    delete ptr;
    return 0;
}

上面的代码,我先写了虚函数function,第31行就是动态绑定,而33行delete删除的是Base型基类指针,此指针是没有派生类Derived的析构函数的,所以如果不在基类的析构函数加上virtual的话,就不能动态绑定派生类的析构函数(当然析构函数的动态绑定你可以看出来跟一般函数的动态绑定相比是特殊的,析构函数的虚函数不用按照函数名来找对应的的函数)。一句话:基类的析构函数加了virtual就可以动态绑定派生类的析构函数,这样的话,在执行多态后删除其对象,就可以在删除对象的时候执行派生类的析构函数了(当然执行基类的析构函数是一定会的)。否则不会执行派生类的析构函数。


代码输出结果:

this is Derived's function

this is Derived's destroy

this is Base's destroy


你可以尝试一下把基类的析构函数前的virtual删掉(第9行),输出结果将是:

this is Derived's function

this is Base's destroy

 
原文:https://blog.youkuaiyun.com/u014453898/article/details/60402586  
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值