当前位置: 首页 > news >正文

c++“二纯” 纯虚函数和纯虚析构

首先给出这样一段概念:

在C++中,当基类包含纯虚函数时,这些纯虚函数在基类中不需要(也不能)有定义。但是,如果基类有一个纯虚析构函数(即析构函数被声明为纯虚函数),那么情况就有些特殊了。纯虚析构函数需要在基类中有声明,但通常也需要在类外提供一个定义(尽管这个定义通常只包含析构函数的空体)。

再通过一段代码更加深入的理解:
#include <iostream>  // 基类  
class Base {  
public:  // 纯虚析构函数  virtual ~Base() = 0 {  // 注意:在C++11及之前的标准中,纯虚析构函数不能提供实现体  // 但在C++11中开始,纯虚析构函数可以在类定义内部有定义体(作为内联成员函数)  // 但在大多数情况下,我们仍然选择将其定义在类定义之外  std::cout << "Base destructor called." << std::endl;  }  // 纯虚函数  virtual void pureVirtualFunction() = 0;  // 其他成员函数  void normalFunction() {  std::cout << "Base normal function called." << std::endl;  }  
};  // 在类定义外部定义纯虚析构函数(如果需要)  
Base::~Base() {  // 注意:这个定义是可选的,并且如果在类定义内部已经提供了定义体,则不需要这里再定义  
}  // 派生类  
class Derived : public Base {  
public:  ~Derived() override {  std::cout << "Derived destructor called." << std::endl;  }  // 提供纯虚函数的实现  void pureVirtualFunction() override {  std::cout << "Derived pure virtual function called." << std::endl;  }  
};  int main() {  // 由于Base是抽象类,不能直接实例化  // Base* base = new Base(); // 错误  // 创建派生类对象并通过基类指针管理  Base* basePtr = new Derived();  // 调用派生类的纯虚函数  basePtr->pureVirtualFunction();  // 调用基类的普通函数  basePtr->normalFunction();  // 删除对象,会先调用派生类的析构函数,再调用基类的析构函数  delete basePtr;  return 0;  
}
总结:
  1. 在C++11及之后的版本中,纯虚析构函数可以在类定义内部直接提供定义体(作为内联成员函数)。但在C++11之前,纯虚析构函数不能在类定义内部提供定义体,它必须在类定义外部定义。

  2. 在这个例子中,Base 类是一个抽象类,因为它包含了一个纯虚函数 pureVirtualFunction()。因此,你不能直接实例化 Base 类的对象。

  3. 当你通过基类指针 basePtr 调用 delete 时,会首先调用派生类 Derived 的析构函数,然后再调用基类 Base 的析构函数。这是因为 Derived 类的析构函数是通过 override 关键字明确指定的,它会先执行自己的清理工作,然后隐式地调用基类的析构函数。如果基类没有纯虚析构函数,并且你试图通过基类指针删除派生类对象,那么只有基类的析构函数会被调用,这可能会导致资源泄漏。

纯虚析构函数的主要目的是确保通过基类指针或引用删除派生类对象时,派生类的析构函数也能被正确调用

相关文章:

c++“二纯” 纯虚函数和纯虚析构

首先给出这样一段概念&#xff1a; 在C中&#xff0c;当基类包含纯虚函数时&#xff0c;这些纯虚函数在基类中不需要&#xff08;也不能&#xff09;有定义。但是&#xff0c;如果基类有一个纯虚析构函数&#xff08;即析构函数被声明为纯虚函数&#xff09;&#xff0c;那么情…...

MATLAB基础应用精讲-【数模应用】二元Logit分析(最终篇)(附python、MATLAB和R语言代码实现)

目录 算法原理 SPSSAU 1、二元logistic分析思路说明 2、如何使用SPSSAU进行二元logistic操作 3、二元logistic相关问题 算法流程 一、分析前准备 1、确定分析项 2.多重共线性判断 3.数据预处理 二、回归基本情况分析 三、模型拟合评价 1、似然比检验 2、拟合优…...

centos7安装mysql(完整)

官网5.7版本&#xff1a;https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar 文件存于百度网盘&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1x0fucIsD36_7agu88Jd2yg 提取码&#xff1a;s4m8 复制这段内容后打开百度网盘手机A…...

C++ STL std::vector的实现机制【面试】

std::vector 是 C 标准模板库&#xff08;STL&#xff09;中的一种序列容器&#xff0c;它封装了动态数组的实现&#xff0c;提供了一系列方法来操作这个动态数组。以下是 std::vector 的一些关键实现机制&#xff1a; 连续内存存储&#xff1a; std::vector 通过一块连续的内存…...

激活函数对比

激活函数 sigmoid / tanh / relu / leaky relu / elu / gelu / swish 1、sigmoid 优缺点 1) 均值!0&#xff0c;导致fwxb求导时&#xff0c;方向要么全正要么全负 可以通过batch批量训练来缓解 2) 输入值大于一定范围梯度就会消失 3) 运算复杂 2、tanh 优缺点 1) 均值0 2)…...

pycharm 上一次编辑位置不见了

目录 pycharm2024版 上一次编辑位置不见了&#xff0c;研究发现移到了左下角了&#xff0c;如下图所示&#xff1a; 上一次编辑位置快捷键&#xff1a; 设置为旧版ui&#xff0c;新版不好用 pycharm2024版 上一次编辑位置不见了&#xff0c;研究发现移到了左下角了&#xff…...

FFmpeg播放器的相关概念【1】

播放器框架 相关术语 •容器&#xff0f;文件&#xff08;Conainer/File&#xff09;&#xff1a;即特定格式的多媒体文件&#xff0c;比如mp4、flv、mkv等。 • 媒体流&#xff08;Stream&#xff09;&#xff1a;表示时间轴上的一段连续数据&#xff0c;如一段声音数据、一段…...

=与==的优先级

项目场景&#xff1a; 在写消息队列的过程中&#xff0c;问题代码如下&#xff1a; #include "message.h"void send(message *msg, int msg_id); void main() {printf("The sender process id %d\n", getpid());key_t key;int msg_id;message msg {.ty…...

在Linux上的Java项目导出PDF乱码问题

在Linux上的Java项目导出PDF乱码问题 场景&#xff1a;一个Java项目导出PDF&#xff0c;在我本地导出是没有问题&#xff0c;但是部署上Linux上后&#xff0c;导出就出现了乱码了。 处理方案 我这里使用的处理方案是在Linux服务器上安装一些PDF需要使用的字体 1.把字体上传到…...

java:使用shardingSphere访问mysql的分库分表数据

# 创建分库与分表 创建两个数据库【order_db_1、order_db_2】。 然后在两个数据库下分别创建三个表【orders_1、orders_2、orders_3】。 建表sql请参考&#xff1a; CREATE TABLE orders_1 (id bigint NOT NULL,order_type varchar(255) NULL DEFAULT NULL,customer_id bigi…...

红酒:如何选择适合的红酒储存容器

选择适合的红酒储存容器对于保持雷盛红酒的品质和风味至关重要。不同的容器具有不同的优缺点&#xff0c;因此应根据个人需求和条件进行选择。以下是一些常见的红酒储存容器的特点和适用场景&#xff1a; 玻璃瓶&#xff1a;玻璃瓶是常见的红酒储存容器。它具有良好的密封性能、…...

【C++】 使用CRT 库检测内存泄漏

CRT 库检测内存泄漏 一、CRT 库简介二、CRT 库的使用1、启用内存泄漏检测2、设置应用退出时显示内存泄漏报告3、丰富内存泄漏报告4、演示使用 内存泄漏是 C/C 应用程序中最微妙、最难以发现的 bug&#xff0c;存泄漏是由于之前分配的内存未能正确解除分配而导致的。 最开始的少…...

python手动搭建transformer,并实现自回归推理

以下是添加了详细注释的代码和参数介绍&#xff1a; Transformer 实现及自回归推理 本文展示了如何手动实现一个简化版的Transformer模型&#xff0c;并用自回归方式实现一个seq2seq任务&#xff0c;例如机器翻译。 导入必要的库 import torch import torch.nn as nn import…...

AI数据分析:用deepseek进行贡献度分析(帕累托法则)

帕累托法则&#xff0c;也称为80/20法则&#xff0c;是由意大利经济学家维尔弗雷多帕累托提出的。它指出在许多情况下&#xff0c;大约80%的效益来自于20%的原因。这个原则在很多领域都有应用&#xff0c;包括商业、经济、社会问题等。 在数据分析中&#xff0c;帕累托法则可以…...

生成式人工智能的风险与治理——以ChatGPT为例

文 | 西南政法大学经济法学院 马羽男 以ChatGPT为代表的生成式人工智能在创造社会福利的同时&#xff0c;也带来了诸多风险。因此&#xff0c;当务之急是结合我国生成式人工智能发展状况&#xff0c;厘清其应用价值与潜在风险之间的关系&#xff0c;以便在不影响应用发展的前提…...

十足正式在山东开疆拓土!首批店7月初开业,地区便利店现全新面貌!

十足便利店将正式进军山东市场&#xff0c;以济南、淄博两座城市为核心发展起点&#xff0c;目前济南市已经有三家十足门店正在装修施工中&#xff0c;首批15家门店将于7月初开业&#xff0c;这标志着十足集团市场战略布局迈出了至关重要的一步。 随着3月份罗森品牌在济南成功开…...

Unity2D游戏开发-玩家控制

在Unity2D游戏开发中&#xff0c;玩家控制是游戏互动性的核心。本文将解析一个典型的Unity2D玩家控制脚本&#xff0c;探讨如何实现流畅的玩家移动、跳跃和动画切换。以下是一个Unity脚本示例&#xff0c;实现了这些基础功能。 1. 脚本结构 using System.Collections; using …...

如何在 Windows 11 上免费恢复永久删除的文件

虽然Windows 上的已删除文件恢复不简单&#xff0c;但您可能希望免费或无需任何软件即可恢复已删除的文件。下面&#xff0c;我们列出了一个指南&#xff0c;其中包含有关如何在 Windows 11 上免费检索永久删除的文件的说明。 #1 奇客数据恢复 奇客数据恢复是一个广受好评的免…...

Spring boot 集成mybatis-plus

Spring boot 集成mybatis-plus 背景 Spring boot集成mybatis后&#xff0c;我们可以使用mybatis来操作数据。然后&#xff0c;我们还是需要写许多重复的代码和sql语句&#xff0c;比如增删改查。这时候&#xff0c;我们就可以使用 mybatis-plus了&#xff0c;它可以极大解放我…...

数据仓库之缓慢变化维

缓慢变化维&#xff08;Slowly Changing Dimensions, SCD&#xff09;是数据仓库设计中的一个重要概念&#xff0c;用于处理维度表中随时间缓慢变化的属性。维度表中的数据通常描述业务实体&#xff08;如客户、产品、员工等&#xff09;&#xff0c;而这些实体的某些属性&…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...

负载均衡器》》LVS、Nginx、HAproxy 区别

虚拟主机 先4&#xff0c;后7...