虚析构函数和纯虚析构函数作用和区别

在C++中,虚析构函数和纯虚析构函数都与多态和继承相关。让我们分别看一下它们的作用,并使用具体的代码来说明。

  1. 虚析构函数:

虚析构函数用于在继承层次结构中正确释放资源。当基类指针指向派生类对象时,使用虚析构函数可以确保调用正确的析构函数,以避免资源泄漏。

#include <iostream>

class Base {
public:
    virtual ~Base() {
        std::cout << "Base destructor" << std::endl;
    }
};

class Derived : public Base {
public:
    ~Derived() override {
        std::cout << "Derived destructor" << std::endl;
    }
};

int main() {
    Base* obj = new Derived();
    delete obj; // 调用Derived的析构函数,然后调用Base的析构函数
    return 0;
}

在这个例子中,Base类的析构函数被声明为虚析构函数。当我们使用Base指针指向Derived对象时,删除这个指针时会调用Derived的析构函数,然后调用Base的析构函数。

  1. 纯虚析构函数:

纯虚析构函数是一个纯虚函数,它没有实现,但是在基类中声明。纯虚析构函数的存在强制派生类提供它自己的析构函数的实现。

#include <iostream>

class AbstractBase {
public:
    virtual ~AbstractBase() = 0; // 纯虚析构函数
    virtual void someFunction() = 0;
};

AbstractBase::~AbstractBase() {
    std::cout << "AbstractBase destructor" << std::endl;
}

class Derived : public AbstractBase {
public:
    ~Derived() override {
        std::cout << "Derived destructor" << std::endl;
    }

    void someFunction() override {
        std::cout << "Derived::someFunction()" << std::endl;
    }
};

int main() {
    AbstractBase* obj = new Derived();
    obj->someFunction();
    delete obj; // 调用Derived的析构函数,然后调用AbstractBase的析构函数
    return 0;
}

在这个例子中,AbstractBase类包含一个纯虚析构函数。Derived类继承自AbstractBase并提供了实际的析构函数实现。同样,当我们使用AbstractBase指针指向Derived对象时,删除指针时会调用Derived的析构函数,然后调用AbstractBase的析构函数。

纯虚析构函数的存在主要是为了表明这个类是一个抽象基类,不能被实例化。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值