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

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。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

上海震坤行:水泥行业数字化采购的趋势、策略与实践

上海震坤行:水泥行业数字化采购的趋势、策略与实践 在中国水泥协会发布的《2023年上半年水泥行业经济运行及下半年展望》中提到了水泥行业的发展现状——2023年上半年,在全球经济增长放缓、国内经济延续恢复态势、但市场需求不足的宏观环境下&#xff0…

直播间搭建设备

直播间搭建对设备的要求因直播类型和直播内容而异,但以下是一些常见的直播设备要求: 1.摄像头∶高清、稳定、画面流畅的摄像头是直播的必备设备。对于大部分直播来说,选择一个质量较好的网络摄像头或手机摄像头即可。但对于需要更高清晰度或专业级别的直…

论文学习-Bert 和GPT 有什么区别?

Foundation Models, Transformers, BERT and GPT 总结一下: Bert 是学习向量表征,让句子中某个词的Embedding关联到句子中其他重要词。最终学习下来,就是词向量的表征。这也是为什么Bert很容易用到下游任务,在做下游任务的时候&a…

C++ Primer 第十六章 模板与泛型编程 重点解读

文章目录 1 定义模板1.1 类模板成员函数的实例化:1.2 在类代码内简化模板类名的使用:1.3 令模板自己的类型参数成为友元(C11)1.4 模板类型别名1.4.1 typedef1.4.2 为模板定义类型别名(C11) 1.5 函数模板与类模板的区别1.6 使用类的…

SpringMVC多种类型数据响应

SpringMVC多种类型数据响应入门 1.概念 RequestMapping 作用:用于建立请求URL和处理请求方法之间的对应关系 位置: 类上,请求URL的第一级访问目录。此处不写的话,就相当于应用的根目录 方法上,请求URL的第二级访问目…

宠物店管理系统服务预约会员小程序效果如何

很多人都会养宠物,随着生活品质提升,尤其以年轻人为主的消费者在宠物食品、医疗、购买消费等方面有较高的消费属性,而在线下也有大量从业者,互联网程度及智慧化门店提升及客户赋能,线下经营的同时还需要线上发展拓客引…

鸿蒙4.0开发笔记之ArkTS装饰器语法基础@Builder组件内自定义构建函数与@Styles自定义组件重用样式(十)

文章目录 一、Builder自定义构建函数1、什么是自定义构建函数2、组件内定义构建函数3、组件外定义构建函数4、Builder装饰器练习 二、Styles重用样式函数1、重用样式的作用2、组件内定义Styles3、组件外定义4、Styles装饰器练习5、注意要点 一、Builder自定义构建函数 1、什么…

寿险公司通过开源治理保障数字创新,安全打通高质量服务新通道

某寿险公司致力于为消费者提供人性化的产品和服务,在中国保险市场中始终保持前列。该寿险公司以挖掘和满足客户需求为出发点,从产品开发、渠道销售、运营流程和售后服务等各环节,借助数字化工具,不断地努力探索并提升服务品质。 精…

NumSharp

github地址:https://github.com/SciSharp/NumSharp High Performance Computation for N-D Tensors in .NET, similar API to NumPy. NumSharp (NS) is a NumPy port to C# targetting .NET Standard. NumSharp is the fundamental package needed for scientific …

Linux Centos系统安装Mysql8.0详解

本文是基于服务器Linux Centos 8.0系统 安装 Mysql8.0真实运维工作实战为例,详细讲解安装的全过程。 1,检查卸载mariadb Mariadb数据库是mysql的分支,mariadb和mysql会有冲突,所以安装Mysql前,首先要检查是否安装了m…

6.如何利用LIO-SAM生成可用于机器人/无人机导航的二维/三维栅格地图--以octomap为例

目录 1 octomap的安装 2 二维导航节点的建立及栅格地图的构建 3 三维栅格地图的建立 1 octomap的安装 这里采用命令安装: sudo apt install ros-melodic-octomap-msgs ros-melodic-octomap-ros ros-melodic-octomap-rviz-plugins ros-melodic-octomap-server 这样…

HPE存储监控

存储设备构成了企业组织的支柱,使应用程序能够运行,可以进行市场研究,并且能够存储关键业务信息以用于日常运营,由于健康的存储网络对于日常业务运营的顺利运行是必不可少的,因此 IT 团队应确保存储基础架构的理想性能…

毫米波传感器系统性能测量(TI文档)

摘要 本应用报告讨论了使用德州仪器高性能毫米波传感器的系统性能测量结果。TI的毫米波传感器是一个77 GHz,高度集成的收发器,具有高速接口(CSI2),可将原始ADC数据发送出去进行处理。毫米波传感器包括整个毫米波射频和模拟基带信号链&#xf…

ubuntu18.04安装miniconda和mysql

MySQL 1.更新软件包 apt-get update 2.mysql安装 apt-get install mysql-server 3.初始化配置mysql mysql_secure_installation 第一个选项是问你要不要安装密码插件,就是说安装了之后你必须用安全度很高的密码,不安装的话,可以随意设…

HAProxy部署Web集群(Nginx)实验

实验前准备 HAProxy服务器:192.168.188.11 内核版本最好要在2.6以上,使用uname -r查看自己的内核版本是否适用 Nginx服务器1:192.168.188.12 Nginx服务器2:192.168.188.13 客户端:192.168.188.1(本机window…

渗透测试|HW蓝队

记录某个对某个钓鱼事件中获取的钓鱼样本进行分析,以及简单的制作学习 样本行为分析 首先看到是 qq 邮箱发来的某个压缩包大概本身是带密码的,反手就丢到虚拟机先看下大概文件,解压后是这样的一个快捷方式 然后打开属性查看快捷方式&#x…

基于STC12C5A60S2系列1T 8051单片机的IIC总线器件24C02实现掉电保存计时时间应用

基于STC12C5A60S2系列1T 8051单片机的IIC总线器件24C02实现掉电保存计时时间应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍液晶显示器LCD1602简单介绍IIC通信简单…

RocketMQ-快速实战

MQ简介 MQ:MessageQueue,消息队列。是在互联网中使用非常广泛的一系列服务中间件。 Message:消息。消息是在不同进程之间传递的数据。这些进程可以部署在同一台机器上,也可以分布在不同机器上。(数据形式&#xff1a…

2023工作中遇到问题一

1、vue中模拟鼠标点击下拉框 <xxx-select ref"aaa" :value"form.serviceCharge" placeholder"请输入" add"(value) > getBasGoods(value)" :configInfo"configInfo" />vue中模拟鼠标点击 this.$refs.aaa.$el.cli…

经典的回溯算法题leetcode全排列问题思路代码详解

目录 全排列问题 leetcode46题.全排列 leetcode47题.全排列II 对回溯算法感兴趣的朋友也可以多多支持一下我的其他文章。 回溯算法详解-CSDN博客 经典的回溯算法题leetcode组合问题整理及思路代码详解-CSDN博客 经典的回溯算法题leetcode子集问题思路代码详解-CSDN博客 …