重载、重写、重定义的辨析

C++重载、重写、重定义

  • 重载、重写、重定义对比
    • 一、重载(overload)
    • 二、重写 / 覆盖(override)
    • 三、重定义 / 隐藏(redefining)
  • * 为什么在虚函数中不能使用 static 关键字?
    • 动态绑定(Dynamic Binding)
    • 静态成员函数
    • conclusion
  • * 重写函数的访问修饰符可以不同吗?
    • 缩小访问权限
    • 放宽访问权限

重载、重写、重定义对比

在这里插入图片描述

一、重载(overload)

指函数名相同,但是它的参数表列个数或顺序,类型不同。但是不能靠返回类型来判断
(1)在同一个作用域中
(2)函数名字相同
(3)参数列表不同(参数个数,参数类型,类型顺序…)
(4)virtual 关键字可有可无
(5)返回值可以相同也可以不同

二、重写 / 覆盖(override)

指派生类中有一个跟基类(返回值类型(除了协变),函数名,参数列表)相同的虚函数,特征是:
(1)两个虚函数分别位于派生类与基类
(2)函数名字相同
(3)参数列表相同
(4)基类函数必须在函数前面加 virtual 关键字,不能有 static
(5)返回值相同(除了协变)
(6)重写函数的访问修饰符可以不同
(派生类中重写的函数可以放宽其在基类中的访问修饰符,尽管基类虚函数是 private 的,派生类中重写改写为 public,protected 也是可以的)

三、重定义 / 隐藏(redefining)

(1)两函数分别位于派生类与基类
(2)函数名字相同
(3)返回值可以不同
(4)参数列表不同。此时,不论有无 virtual 关键字,基类的函数将被隐藏(注意别跟重载混淆,首先作用域就不同,重载要求在同一作用域) 。
(5)参数相同,但是基类函数没有 virtual关键字。此时,基类的函数被隐藏。
(6)隐藏的函数不具备多态性。
两个同名函数分别位于派生类与基类,不是构成重写就是构成重定义

* 为什么在虚函数中不能使用 static 关键字?

为什么在虚函数中不能使用 static 关键字呢?
这需要考虑两者的特性——

在C++中,虚函数和静态成员函数有不同的语义和用途,因此它们在语法上是互斥的。

动态绑定(Dynamic Binding)

虚函数的一个关键特性是动态绑定(也称为运行时多态性)。当通过基类的指针或引用调用虚函数时,实际调用的是派生类的版本,这个决定是在运行时根据对象的实际类型进行的——这种机制使得程序能够根据对象的实际类型执行我们希望的操作。

静态成员函数

静态成员函数属于类而不是类的实例。
静态成员函数在整个类中是共享的。
静态成员函数在编译时就被解析,因为它们不依赖于对象的实际类型。

conclusion

由于虚函数和静态成员函数具有不同的调用和解析机制,将它们结合在一起可能导致混淆。

在C++中,虚函数是通过虚函数表和虚指针来实现的,而静态成员函数不涉及这些机制~

因此,为了保持语言的一致性和清晰性,C++规定在虚函数声明中不能使用 static 关键字。在使用虚函数时,编译器会使用动态绑定机制,而静态成员函数不参与这种机制,因此在虚函数中使用 static 不合适

* 重写函数的访问修饰符可以不同吗?

派生类中重写基类中的虚函数时,派生类中的函数的访问修饰符可以有一些变化,但有一些限制:

缩小访问权限

派生类中重写的函数可以缩小其在基类中的访问修饰符。

  1. 如果基类中的虚函数是 public,那么在派生类中可以选择将其重写为 public、protected 或 private。
  2. 如果基类中的虚函数是 protected,那么在派生类中可以选择将其重写为 protected 或 private。
  3. 如果基类中的虚函数是 private,则不能在派生类中直接重写。
    在这里插入图片描述

放宽访问权限

派生类中重写的函数不可以放宽其在基类中的访问修饰符。

例如,如果基类中的虚函数是private,则派生类中重写时不能将其放宽为public。

在这里插入图片描述在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

外贸行业多人文件共享云盘推荐

Zoho WorkDrive外贸行业解决方案致力于为各类外贸企业客户提供数字化转型的支持,全面覆盖市场调研、客户服务与管理、产品设计与制作、采购、供应商管理、财务对账、单证报关、仓储管理以及物流运输等环节。Zoho WorkDrive企业网盘提供文件资料在线存储、共享、同步…

springboot启动开启热部署

springboot启动开启热部署 手动方式 或者点idea上面的build->build project 自动方式 勾上Build project automatically 然后ctrl alt shift / 选择Registr 勾上就好了 新版idea可以在这里选 热部署范围设置 这是spring-boot-devtools起的作用,所以还…

初识Linux

1、简介 Linux,一般指GNU/Linux(单独的Linux内核并不可直接使用,一般搭配GNU套件,故得此称呼),是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯本纳第克特托瓦兹(Linus Be…

行情分析——加密货币市场大盘走势(11.29)

大饼已经形成了底背离,即MACD往下走,而价格还在往上走,这种后续往往会大跌。继续把空单拿好,已经持仓的无需加仓。多次上涨却一直不能突破,说明多空和空军力量都很强,等待后续出方向。在笔者看来&#xff0…

标题导航点击导航滑动到指定位置滑动到指定位置选中对应导航vue3

菜单导航栏点击导航滑动到指定位置&滑动到指定位置选中对应导航 效果 实现 话不多说直接上代码,有用素质三连(点赞、评论、加关注) import { defineComponent, onBeforeUnmount, onMounted, reactive, ref } from "vue"; import { map } from &quo…

Typora .MD笔记中本地图片批量上传到csdn (.PNG格式)(无需其他任何图床软件)

Typora .MD笔记中本地图片批量上传到csdn (.PNG格式)(无需其他任何图床软件) 截图软件推荐 qq 截图 快捷键 ctrlshiftA. 步骤一 设置Typora 的图片 点击文件. 点击偏好设置 ->图像 我们可以选择将图片复制到我们的文件夹中。 建议刚写好文件标题就…

推荐6款本周 yyds 的开源项目

🔥🔥🔥本周GitHub项目圈选: 主要包含 链接管理、视频总结、有道音色情感合成、中文文本格式校正、GPT爬虫、深度学习推理 等热点项目。 1、Dub 一个开源的链接管理工具,可自定义域名将繁杂的长链接生成短链接,便于保…

抖音直播招聘报白如何提高求职者体验?

为了提升抖音直播招聘报白中求职者的体验,以下是一些建议: 提供清晰的招聘流程和信息。在直播招聘开始之前,企业或人力资源公司应提供清晰的流程和信息,包括直播时间和直播平台, 职位信息,招聘要求等&…

Go语言多线程爬虫万能模板它来了!

对于长期从事爬虫行业的技术员来说,通过技术手段实现抓取海量数据并且做到可视化处理,我在想如果能写一个万能的爬虫模板,后期遇到类似的工作只要套用模板就能解决大部分的问题,如此提高工作效率何乐而不为? 以下是一个…

pinia从入门到使用

pinia: 比vuex更适合vue3的状态管理工具,只保留了vuex 原有的 state, getters,actions 作用等同于 data computed methods,可以有多个 state 1.安装创建导入 安装:npm install pinia 或 yarn add pinia 创建stores/index.js inde…

python+pytest接口自动化(4)-requests发送get请求

python中用于请求http接口的有自带的urllib和第三方库requests,但 urllib 写法稍微有点繁琐,所以在进行接口自动化测试过程中,一般使用更为简洁且功能强大的 requests 库。下面我们使用 requests 库发送get请求。 requests库 简介 request…

网络和Linux网络_7(传输层)UDP和TCP协议(端口号+确认应答+超时重传+三次握手四次挥手)

目录 1. 重看端口号 1.1 端口号的概念 1.2 端口号的划分 2. 重看UDP协议 2.1 UDP协议格式 2.2 UDP的特点 3. 重看TCP协议 3.1 TCP协议格式 3.2 TCP的解包分用 3.3 TCP的可靠性及机制 3.3.1 确认应答ACK机制 3.3.2 超时重传机制 3.3.3 连接管理机制(三次…

手写工作流设计模式,针对常见的工作流步骤流转,减少过多的if/else,提升编程思维

需求 这一年下来,写两次工作流流转,总结下经验。 第一次写的时候,只找到用模版设计模式包裹一下,每个方法都做隔离,但是在具体分支实现的时候,if/else 满屏分,而且因为要针对不同情况&#xff…

Linux系统centos7防火墙firewall开放IP及端口命令

CentOS7使用的是firewall防火墙,不再是原来的iptables 防火墙基础命令 1:查看firewall防火墙状态 firewall-cmd --state //或 systemctl status firewalld2:打开防火墙 systemctl start firewalld3:关闭防火墙 systemctl sto…

什么牌子的led台灯质量好?考研必备五款护眼台灯推荐

眼睛更是心灵的窗户,我们通过这扇窗来欣赏这个美好的世界。而如今,近视在儿童中已司空见惯,近视率逐年提高,并且低龄化的现状更加突出。据世界卫生组织的最新研究报告,目前中国近视患者人数多达6亿,其中我国…

20. Matplotlib 数据可视化

目录 1. 简介2. Matplotlib 开发环境2.1 画图2.2 画图接口2.4 线形图2.5 散点图2.6 等高线图2.7 直方图 1. 简介 Matplotlib网址:https://matplotlib.org/ 数据可视化是数据分析中最重要的工作之一。Matploblib是建立在Numpy数组基础上的多平台数据可视化程序库&a…

WPF前端实现人脸扫描动画效果

前言 本章实现的效果主要通过OpacityMask与LinearGradientBrush(径向渐变) 的组合应用来实现。最终实现效果如下: LinearGradientBrush线性渐变画刷 LinearGradientBrush其实很简单,我们只需要关注5个属性,使用这5个属性你就可以完成这个画刷几乎所有的变化。 属性介…

样品实验Placcel230N聚己内酯二元醇PCL说明书

样品实验Placcel230N聚己内酯二元醇PCL说明书 1KG/罐

财报解读:三季度的美国零售,“沃尔玛效应”仍在持续

经济学中常用“沃尔玛效应”来指代“消费者减少消费时,会选择每种类别中价格最低的商品”这一现象。作为全球最大的零售商,沃尔玛一定程度上成为了消费市场的风向标。 近日,沃尔玛发布的2024财年第三季度财报显示,其相较去年同期…

Linux:Ubuntu系统安装软件

本次以安装vim为例 sudo apt-get remove vim //卸载vim sudo apt-get install vim //安装vim sudo apt-cache show vim //获取vim软件信息安装时间较长。 安装完成后,执行下第三条指令,测试下是否安装成功即可。