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

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/162216.html

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

相关文章

【项目设计】网络版五子棋游戏

文章目录 一、项目介绍1. 项目简介2. 开发环境3. 核心技术4. 开发阶段 二、环境搭建1. 安装 wget 工具2. 更换 yum 源3. 安装 lrzsz 传输工具4. 安装⾼版本 gcc/g 编译器5. 安装 gdb 调试器6. 安装分布式版本控制工具 git7. 安装 cmake8. 安装 boost 库9. 安装 Jsoncpp 库10. 安…

C语言实现冒泡排序(超详细)

排序算法 - 冒泡排序 什么是冒泡排序?冒泡排序有啥用呢?冒泡排序的实现代码讲解冒泡排序的总结 什么是冒泡排序? 冒泡排序是一种简单的排序算法,它重复地遍历要排序的列表,一次比较两个元素,如果它们的顺序…

详谈动态规划问题并解最大子数组和

今天刷力扣又学会了一种算法----动态规划,经过我查阅不少资料后,这些我总结的分享给大家 动态规划是什么? 动态规划(Dynamic Programming)是一种求解最优化问题的数学方法,它通常用于解决具有重叠子问题和…

802.11-2020协议学习__专题__TxTime-Calculation__HR/DSSS

802.11-2020协议学习__专题__TxTime-Calculation__HR/DSSS 16.2.2 PPDU format16.2.2.1 General16.2.2.2 Long PPDU format16.2.2.3 Short PPDU format 16.3.4 HR/DSSS TXTIME calculation PREV: TBD NEXT: TBD 16.2.2 PPDU format 16.2.2.1 General 定…

快速集成Skywalking 9(Windows系统、JavaAgent、Logback)

目录 一、Skywalking简介二、下载Skywalking服务端三、安装Skywalking服务端3.1 解压安装包3.2 启动Skywalking 四、关于Skywalking服务端更多配置五、Java应用集成skywalking-agent.jar5.1 下载SkyWalking Java Agent5.2 集成JavaAgent5.3 Logback集成Skywalking5.4 集成效果 …

Java Fasn 带您谈谈——开源、闭源

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 ✨特色专栏&#xff1a…

Python —— Mock接口测试

前言 今天跟小伙伴们一起来学习一下如何编写Python脚本进行mock测试。 什么是mock? 测试桩,模拟被测对象的返回,用于测试 通常意义的mock指的就是mock server, 模拟服务端返回的接口数据,用于前端开发,第三方接口联调 为什么…

特征缩放和转换以及自定义Transformers(Machine Learning 研习之九)

特征缩放和转换 您需要应用于数据的最重要的转换之一是功能扩展。除了少数例外,机器学习算法在输入数值属性具有非常不同的尺度时表现不佳。住房数据就是这种情况:房间总数约为6至39320间,而收入中位数仅为0至15间。如果没有任何缩放,大多数…

anaconda安装依赖报错ERROR: Cannot unpack file C:\Users\33659\AppData\Loca...|问题记录

执行命令: # 安装matplotlib依赖 pip install matplotlib-i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com出现问题: ERROR: Cannot unpack file C:\Users\33659\AppData\Local\Temp\pip-unpack-0au_blfq\simple (downloa…

Redis面经

Redis使用场景 1、缓存: 缓存三兄弟(穿透、击穿、雪崩) 、双写一致、持久化、数据过期策略,数据淘汰策略 2、分布式锁 setnx、redisson 3、消息队列 4、延迟队列 何种数据类型(list、zset) 缓存三兄弟 缓存穿透 缓存穿透…

【RH850芯片】RH850U2A芯片平台Spinlock的底层实现

目录 前言 正文 1.RH850U2A上的原子操作 1.1 Link 1.2 Link generation 1.3 Success in storing 1.4 Failure in storing 1.5 Condition for successful storing 1.6 Loss of the link 1.7 示例代码 2.Spinlock代码分析 2.1 尝试获取Spinlock 2.2 释放Spinlock …

Web前端—移动Web第二天(空间转换、动画、综合案例:全名出游)

版本说明 当前版本号[20231118]。 版本修改说明20231118初版 目录 文章目录 版本说明目录移动 Web 第二天01-空间转换空间转换简介平移视距旋转左手法则rotate3d-了解立体呈现案例-3d导航缩放 02-动画动画实现步骤animation复合属性animation拆分写法案例-走马灯精灵动画多组…

一款带数字传输信号的OVP芯片

基本概述 今天给大家介绍的一款芯片是OVP,相比于传统的OVP芯片来说,这款芯片新增了数字信号控制,可以进行10Mbps的一个通信,通过外部的GPIO口进行控制,达到输入与输出信号的产生。 YHM2009这款OVP芯片具有较低的导通…

图像分类(一) 全面解读复现AlexNet

解读 论文原文:http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf Abstract-摘要 翻译 我们训练了一个庞大的深层卷积神经网络,将ImageNet LSVRC-2010比赛中的120万张高分辨率图像分为1000个不…

如何实现一个下班倒计时程序

shigen日更文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。 Hello伙伴们,好几天不见啦。最近也是晚上打球太累,加上一直在研究mybatis的多租户问题&…

LM(大模型)应用开发利器之LangChain,带你走进AI世界

原文:LLM(大模型)应用开发利器之LangChain,带你走进AI世界 - 简书 LangChain组件图 LangChain 是什么 首先 LangChain 是一个框架,这个框架是用来让开发者进行 LLMs (大语言模型)应用开发的。…

【Unity】单例模式及游戏声音管理类应用

【Unity】单例模式及游戏声音管理类应用 描述 在日常游戏项目开发中,单例模式是一种常用的设计模式,它允许在应用程序的生命周期中只创建一个对象实例,并提供对该实例的全局访问点。通过使用单例模式,可以提高代码的可维护性和可…

【18年扬大真题】定义一个类Student记录学生计算机课程的成绩。要求使用静态成员变量或静态成员函数计算全班学生计算机课程的总成绩和平均成绩

【18年扬大真题】 定义一个类Student记录学生计算机课程的成绩。要求使用静态成员变量或静态成员函数计算全班学生计算机课程的总成绩和平均成绩 #include<stdio.h> #define n 5;//假设5个学生 typedef struct {char name[10];float score; }stu;int main() {printf(&qu…

LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字

上一节实现了 LangChain 实现给动物取名字&#xff0c; 实际上每次给不同的动物取名字&#xff0c;还得修改源代码&#xff0c;这周就用模块化template来实现。 1. 添加promptTemplate from langchain.llms import OpenAI # 导入Langchain库中的OpenAI模块 from langchain.p…

数据结构详细笔记——图

文章目录 图的定义图的存储邻接矩阵法邻接表法邻接矩阵法与邻接表法的区别 图的基本操作图的遍历广度优先遍历&#xff08;BFS&#xff09;深度优先遍历&#xff08;DFS&#xff09;图的遍历和图的连通性 图的定义 图G由顶点集V和边集E组成&#xff0c;记为G(V,E)&#xff0c;…