析构函数和纯析构函数的区别是什么

news/2025/3/26 17:02:28/

首先,我们需要明确什么是纯虚函数。纯虚函数是在基类中声明但不定义的虚函数,由派生类来定义。基类中的纯虚函数使该基类成为一个抽象基类,不能创建该类的对象,只能创建其派生类的对象。

纯虚析构函数同样是声明但不定义的虚析构函数。然而,有一个重要的区别:尽管纯虚析构函数是纯虚的,但仍然需要为其提供定义,这是因为,当派生类的对象被销毁时,基类的析构函数仍然会被调用。

以下是纯虚析构函数的一个例子:

#include
using namespace std;

class AbstractBase {
public:
// 构造函数
AbstractBase() {
cout << “AbstractBase Constructor!” << endl;
}

// 纯虚析构函数
virtual ~AbstractBase() = 0; 

};

// 纯虚析构函数的定义
AbstractBase::~AbstractBase() {
cout << “AbstractBase Destructor!” << endl;
}

class Derived : public AbstractBase {
public:
Derived() {
cout << “Derived Constructor!” << endl;
}

~Derived() {cout << "Derived Destructor!" << endl;
}

};

int main() {
Derived obj;
// 当离开作用域时,先调用Derived的析构函数,再调用AbstractBase的析构函数
return 0;
}
输出为:

Copy code
AbstractBase Constructor!
Derived Constructor!
Derived Destructor!
AbstractBase Destructor!
区别总结:

纯虚析构函数:它使类成为抽象类,防止该类的实例化。尽管它是纯虚的,但还是需要定义。

普通虚析构函数:它允许在派生类中重写,确保基类指针指向派生类对象时,派生类的析构函数会被正确调用。也需要定义。

普通析构函数:没有virtual关键字的普通析构函数。如果基类指针指向派生类对象,并试图删除它,可能不会调用派生类的析构函数,导致资源泄露。

在上面的例子中,当Derived类的对象被销毁时,首先调用Derived类的析构函数,然后调用AbstractBase类的析构函数。这展示了虚析构函数的一个关键用途:确保当使用基类指针指向派生类对象时,析构函数的调用顺序是正确的。


http://www.ppmy.cn/news/1023200.html

相关文章

硬件产品经理:如何使用战略方法论BSC做阶段复盘?

目录 前言 平衡计分卡 BSC 产品经理进阶专栏目录 CSDN学院 前言 虽然是在出差的旅途中&#xff0c;最近的感触也是颇深。 阶段复盘对于企业&#xff0c;甚至是个人来说都是尤为重要的。 在复盘的过程中&#xff0c;你会总结出一些对人、事、物的一些新的思考。 这无疑会…

MyBatis学习笔记3

日志 1.日志工厂 如果一个数据库的操作&#xff0c;出现了异常&#xff0c;我们需要排错。日志就是最好的工具。 日志工厂&#xff1a;SLF4JLOG4J(掌握&#xff09;LOG4J2JDK_LOGGINGCOMMONS_LOGGINGSTDOUT_LOGGING&#xff08;掌握&#xff09;NO_LOGGING 2.分页 减少数据…

【STM32RT-Thread零基础入门】 2. 新建RT-Thread项目

硬件&#xff1a;STM32F103ZET6、ST-LINK、usb转串口工具 文章目录 前言一、新建RT-Thread项目二、项目结构三、构建项目四、下载程序&#xff08;调试器下载&#xff09;五、终端交互总结 前言 RT-Thread的全称是Real Time Thread&#xff0c;顾名思义&#xff0c;它是一个嵌…

Mysql SUBSTRING_INDEX - 按分隔符截取字符串

作用&#xff1a; 按分隔符截取字符串 语法&#xff1a; SUBSTRING_INDEX(str, delimiter, count) 属性&#xff1a; 参数说明str必需的。一个字符串。delimiter必需的。分隔符定义&#xff0c;是大小写敏感&#xff0c;且是多字节安全的count必须的。大于0或者小于0的数值…

Qt扫盲-Qt Model/View 理论总结 [上篇]

Qt Model/View 理论总结 [上篇] 一、概述1.model / view 架构2. Model3. View4. Delegate5. 排序6. 快捷类 二、使用model/view1. Qt包含两种 model2. 在现有 model 中使用 view 三、Model 类1. 基本概念1.model 索引2. 行和列2. item 的父 item3. Item roles4. 总结 2. 使用mo…

Scratch 游戏 之 大地图引擎之摄像头控制

引子 上一期教程我们讲了如何制作一个可以侦测视角外碰撞的大地图引擎&#xff0c;这期我们就来制作一下摄像头限制。 首先&#xff0c;我们先要测试出地图的摄像头限制值&#xff1a; 如何测试呢&#xff0c;我们只需要在游戏中移动玩家角色&#xff0c;来求得四个值&#xff…

【二】数据库系统

数据库系统的分层抽象DBMS 数据的三个层次从 数据 到 数据的结构----模式数据库系统的三级模式&#xff08;三级视图&#xff09;数据库系统的两层映像数据库系统的两个独立性数据库系统的标准结构 数据模型从 模式 到 模式的结构----数据模型三大经典数据模型 数据库的演变与发…

网络安全知识总结【二】

一、js函数声明->function 一共有三种方式 第一种 function命令后面是函数名&#xff0c;函数名后面是一对圆括号&#xff0c;里面是传入函数的参数。函数体放在大括号里面。 function print(a){console.log(a); }上面的代码命名了一个print函数&#xff0c;以后使用pri…