析构函数可以为纯虚函数吗?纯虚函数可以有函数体吗?纯虚函数需要函数体吗?

news2025/1/19 22:30:17

先回答标题中中的几个问题:

  • 析构函数可以为纯虚函数吗?
    yes。
  • 纯虚函数可以有函数体吗?
    yes。
  • 纯虚函数需要函数体吗?
    一般来讲,如果析构函数是纯虚函数,那么析构函数必须要有函数体,如果是其它函数为纯函数,没有必要写函数体。

那么现在问题又来了:

  • 析构函数什么时候应该声明为纯虚函数?
  • 当析构函数为纯虚函数时,为什么需要定义函数体?

1、纯虚函数与抽象类

基本概念相信大家都有所了解,这里主要强调几点:
(1)抽象类不能用例实例化对象,即不能用抽象类来定义一个对象。
(2)如果一个类包含一个纯虚函数,那么就是抽象类。即抽象了至少包含一个纯虚函数。
(3)抽象类中并不是所有的函数都是纯虚函数

2、虚函数和纯虚函数的区别

我们经常在看到类似如下的定义,于是很多人就存在一个误区,以为虚函数和纯虚函数就是有没有函数体的区别

class Base {
    public:
    virtual void func1() {  // 虚函数
        cout << "Base: func1" << endl;
    }
    virtual void func2()  = 0; // 纯虚函数

};

其实纯虚函数也是可以有自己的函数体的:

class Base {
    public:
    virtual void func1() = 0;
     
    virtual ~Base() = 0; // 纯虚函数

};
void Base :: func1() {  // 纯虚函数func1 函数体

}
Base :: ~Base() {   // 纯虚析构函数 函数体

}

通过上面的例子只是想说明,纯虚函数也是可以有函数体的,只是大多数时候没有必要

3、什么时候析构函数声明为虚函数?

先说一下,析构函数为虚函数和非析构函数为虚函数有啥不同?
当析构函数为虚函数时,在子类析构的时候,也会连同父类一起析构。

#include <bits/stdc++.h>
using namespace std;
class Derived : public Base {
    public:
    void func1() {
        cout << "Derived: func1" << endl;
    }
    ~Derived() {
        cout << "~Derived" << endl;
    }
};
int main()
{
    Base * pd = new Derived;
    pd->func1();
    cout << "finish...\n";
    delete pd;
    return 0;
}

打印结果如下:
在这里插入图片描述
从上面的结果可以看到,如果是普通的虚函数func1,只会调用调用派生类的func1, 但是如果是虚析构函数,还会调用基类的析构函数。即:当基类的析构函数设置为虚函数时,delete时可以实现多态链式调用,子类的析构函数会调用父类的析构函数,并一层一层向最顶层的基类传递。

因此,如果我们在析构子类的时候,也希望基类也进行相关的析构动作,那么就需要将析构函数设置为虚函数

4、纯虚析构函数

如果我们想创建一个抽象类,我们知道,抽象类中必须包含至少一个纯虚函数,如果基类没有其它合适的函数适合作为纯虚函数,那么我们就可以将析构函数声明为纯虚函数。也就是说,这里将析构函数定义为纯虚函数,只是为了建立一个抽象类的需要

由于析构函数为虚函数(纯虚函数或非纯虚函数), 子类在析构的时候都会调用基类的析构函数,基类的析构函数必须要有函数体。这就是为什么当析构函数声明为纯虚函数时,也必须要有函数体, 不然没法被子类调用,这也是为什么非析构函数作为纯虚函数时,一般不需要函数体,因为子类不会调用基类的函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/84747.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Web前端大作业:基于bootstrap响应式页面,家具装修公司网站

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

最新版本APT漏洞利用工具箱

点击"仙网攻城狮”关注我们哦~不当想研发的渗透人不是好运维让我们每天进步一点点简介1.最近发现一个好用的渗透工具箱&#xff0c;基本包含最新热门漏洞exp&#xff0c;分享一下项目地址&#xff1a;https://github.com/White-hua/Apt_t00ls环境&#xff1a;jdk1.8如果双…

【深度学习】PyTorch深度学习实践 - Lecture_11_Advanced_CNN

文章目录一、GoogLe Net1.1 网络结构1.2 Inception Model1.3 11 Convolution1.4 PyTorch-GPU 实现 GoogLe Net二、Residual Net2.1 梯度消失和梯度爆炸2.2 残差模块2.3 PyTorch-GPU 实现 Simple Residual Net2.3.1 整体结构2.3.2 残差块对象2.3.3 残差网络对象2.3.4 完整代码三…

微服务框架 SpringCloud微服务架构 分布式事务 38 动手实践 38.7 案例实现TCC 模式【分析】

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 分布式事务 文章目录微服务框架分布式事务38 动手实践38.7 案例实现TCC 模式【分析】38.7.1 实现TCC 模式38.7.2 TCC 的空回滚 和业务悬挂38…

Redis框架(八):大众点评项目 逻辑过期时间处理缓存击穿

大众点评项目 逻辑过期时间处理缓存击穿需求&#xff1a;逻辑过期时间处理缓存击穿业务实现总结SpringCloud章节复习已经过去&#xff0c;新的章节Redis开始了&#xff0c;这个章节中将会回顾Redis实战项目 大众点评 主要依照以下几个原则 基础实战的Demo和Coding上传到我的代…

七分钟教会你如何编写一个合格的测试用例

目录 1、测试用例的基本要素 2、根据测试用例去测试带来的好处 3、测试用例的设计方法 3.1、等价类 3.2、边界值 3.3、错误猜测法 3.4、场景法 3.5、因果图法 3.6、正交排列 4、怎样判断一个测试用例是好的测试用例 1、测试用例的基本要素 测试用例是为了实施测试而向…

基于LEACH和HEED的WSN路由协议研究与改进(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

Google谷歌浏览器Post请求预见strict-origin-when-cross-origin跨域问题的 解决办法

问题概述 关于这个问题&#xff0c;后端接口开发完成&#xff0c;前端功能界面和函数方法体编写完成后&#xff0c;博主在前后端联调的时候遇到的&#xff0c;接口是调用成功了&#xff0c;但是没有返回任何结果&#xff0c; 错误信息&#xff1a;“ Referrer Policy: strict-…

C++中二叉树的非递归遍历方法2-1

1 二叉树简介 树是一种数学上的抽象&#xff0c;在算法的设计与分析中起到一个中心作用。树是有n个节点的有限集合。二叉树是树的一种特殊形式&#xff0c;这种树的每个节点最多有2个子节点。 2 二叉树的遍历方法 二叉树的遍历分为前序遍历、中序遍历、后序遍历和层序遍历四…

【华为上机真题 2022】寻找身高相近的小朋友

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

力扣(LeetCode)147. 对链表进行插入排序(C++)

排序 ①遍历链表&#xff0c;当前遍历的结点记作 ppp 。 ②从前往后遍历链表&#xff0c;找到最后一个值小于 ppp 的结点 curcurcur 。 ③(关键操作) 插入&#xff0c;如图&#xff0c;将 ppp 插入 curcurcur 的后面。 p->next cur->next; cur->next p; p next;…

关于Mac启动人人开源前端项目遇到node-sass下载不了的问题!

今天在网上看到了一个前后端分离用户管理系统&#xff0c;于是心血来潮下载下来看一看&#xff0c;结果发现前端项目中用Mac开发的话坑比较多 1.关于node版本问题 node版本最好不要太高&#xff0c;我对于该项目使用的node版本是v10.16.3 node版本最好使用nvm来管理&#xff0c…

[附源码]Python计算机毕业设计Django的图书互换系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

java基于springboot的在线电影评论投票系统

项目介绍 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代…

可以提高开发效率的vscode插件

1&#xff0c;koroFileHeader 我们在新建一个文件后&#xff0c;常常需要在文件头部加入默认注释&#xff0c;vscode中提供了一个 的插件&#xff0c;可以帮助我们实现。 1.1&#xff0c;安装插件 在vscode extensions中搜索并按照koroFileHeader 插件 installl完成后&…

大数据-HDFS的Shell操作

一、了解HDFS常用Shell命令 1、三种Shell命令方式 命令适用场合hadoop fs适用于任何不同的文件系统&#xff0c;比如本地文件系统和HDFS文件系统hadoop dfs只能适用于HDFS文件系统hdfs dfshdfs dfs跟hadoop dfs的命令作用一样&#xff0c;也只能适用于HDFS文件系统 2、常用HD…

基于C+++Mysql实现(WinForm)图书管理系统【100010034】

图书管理系统 实验内容、步骤以及结果 做出数据流图和数据字典。 在数据流图和字典的基础上做出 E-R 图(概念结构设计)。 学生&#xff1a; 图书&#xff1a; 管理员&#xff1a; 汇总&#xff1a; 在 E-R 图基础上进行关系模式设计&#xff08;至少满足 3NF&#xff09;&am…

b站黑马的Vue快速入门案例代码——计数器

目录 目标效果&#xff1a; 重点原理&#xff1a; 1.创建Vue实例的时候&#xff1a; 2.v-on——为元素绑定事件 3.v-text——【解析文本用】设置标签的文本值 v-text【简写】为{{}} 实现步骤&#xff1a; 代码部分&#xff1a; 1.计数器模板.html(全是重点&#xf…

【Redis缓存】主从、哨兵、 Cluster集群一锅端,一文带你全了解

Redis主从Redis哨兵Redis Cluster集群公众号&#xff1a;捡田螺的小男孩 \1. Redis 主从 面试官经常会问到Redis的高可用。Redis高可用回答包括两个层面&#xff0c;一个就是数据不能丢失&#xff0c;或者说尽量减少丢失;另外一个就是保证Redis服务不中断。 对于尽量减少数据…

KKALRRQETVDAL,129198-88-5,钙调蛋白激酶底物

Autocamtide 2是钙/钙调蛋白依赖的蛋白激酶II (CaMKII)的高选择性肽底物。 它可以用于测定CaMKII的活力。Autocamtide 2 is a highly selective peptide substrate of calcium/calmodulin-dependent protein kinase II (CaMKII). It can be used in the CaMKII activity assay.…