当前位置: 首页 > 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;而这些实体的某些属性&…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...