C++编程基础之override关键字

在这里插入图片描述

在C++中,override关键字用于显式地标识派生类中的成员函数是对基类中虚函数的重写,具有以下重要作用和使用说明:

作用

  • 增强代码可读性:通过使用override关键字,能够清晰地向阅读代码的人表明该函数是有意重写基类中的虚函数,而不是偶然定义了一个具有相同名称的新函数。这使得代码的意图更加明确,尤其是在复杂的继承体系中,有助于提高代码的可维护性和可读性。例如,当其他开发者查看派生类代码时,看到带有override关键字的函数,就可以立即知道该函数与基类中的某个虚函数相关联,并且是在重写其行为。
  • 编译器检查重写的正确性override关键字为编译器提供了额外的信息,使其能够在编译时检查函数重写是否符合C++的规则。编译器会验证派生类中的函数签名(包括函数名称、参数列表、常量性以及返回值类型,除了符合协变返回类型规则的情况)是否与基类中的虚函数完全匹配。如果存在不匹配的情况,编译器会报错,指出重写错误。这有助于在开发阶段早期发现错误,避免在运行时因函数签名不匹配而导致的未定义行为,如调用错误的函数版本或产生意外的结果。

使用说明

  • 函数签名必须匹配(除协变返回类型情况外)
    • 函数名称相同:派生类中声明为override的函数必须与基类中的虚函数具有相同的名称。例如,如果基类中有一个虚函数名为draw,派生类中重写该函数时也必须命名为draw
    • 参数列表相同:参数的数量、类型和顺序都必须完全一致。包括参数的类型是否为常量引用(const reference)等修饰符也需要匹配。例如,基类虚函数void setValue(int value),派生类重写函数也必须是void setValue(int value),不能是void setValue(double value)void setValue(int& value)(除非基类函数本身就是接受引用参数)等不同的参数列表形式。
    • 常量性一致:如果基类中的虚函数是常量成员函数(即函数声明后带有const关键字),派生类中的重写函数也必须是常量成员函数。反之,如果基类函数不是常量成员函数,派生类函数也不能是常量成员函数。例如,基类虚函数int getData() const,派生类重写函数必须是int getData() const
    • 返回值类型(大多数情况):一般情况下,返回值类型必须完全相同。但从C++11开始,存在协变返回类型的例外情况,即如果基类函数返回一个指向基类类型的指针或引用,派生类函数可以返回一个指向派生类类型的指针或引用,并且这被视为合法的重写。例如,基类函数Animal* createAnimal(),派生类可以重写为Dog* createAnimal()(假设DogAnimal的派生类)。但对于其他基本类型或对象类型(非指针/引用),返回值类型必须严格一致。例如,基类函数int calculateValue(),派生类重写函数不能返回double类型。
  • 只能用于重写虚函数override关键字只能用于在派生类中重写基类中已声明为虚函数的函数。如果尝试在非虚函数上使用override关键字,或者在派生类中声明一个与基类中不存在的虚函数同名(且签名不匹配)的函数并使用override,编译器将报错。例如,以下代码是错误的:
class Base {
public:void normalFunction() {} 
};class Derived : public Base {
public:// 错误,不能在非虚函数上使用overridevoid normalFunction() override {} 
};
  • 虚函数继承关系必须明确:基类中的虚函数必须是可访问的,并且派生类必须以publicprotected方式继承自基类,才能正确重写虚函数并使用override关键字。如果派生类以private方式继承基类,即使函数签名匹配,也不能使用override关键字,因为在这种情况下,基类中的虚函数在派生类中变为不可访问。例如:
class Base {
private:virtual void hiddenVirtualFunction() {} 
};class Derived : public Base {
public:// 错误,基类中的虚函数不可访问,无法重写void hiddenVirtualFunction() override {} 
};
  • 与函数重载的区别:函数重载是在同一作用域内定义多个同名函数,但它们的参数列表不同(参数数量、类型或顺序不同)。而override关键字用于在派生类中重写基类中的虚函数,强调的是函数签名的完全匹配(除协变返回类型外)以及函数之间的继承关系。例如:
class MathUtils {
public:int add(int a, int b) { return a + b; } double add(double a, double b) { return a + b; } // 这是函数重载,根据参数类型不同选择不同的函数版本执行
};class AdvancedMathUtils : public MathUtils {
public:// 错误,与基类函数签名不匹配,不是重写,不能使用overrideint add(int a, int b, int c) override { return a + b + c; } 
};

在上述例子中,MathUtils类中的两个add函数是重载关系,而AdvancedMathUtils类中尝试定义的函数不符合重写规则,不能使用override关键字。

正确使用override关键字可以提高C++程序的正确性、可读性和可维护性,确保在继承体系中虚函数的重写行为符合预期,避免潜在的错误。在编写派生类时,如果需要重写基类中的虚函数,应始终记得使用override关键字,并严格遵循上述使用说明。

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

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

相关文章

Leecode刷题C语言之按键变更的次数

执行结果:通过 执行用时和内存消耗如下: int countKeyChanges(char* s) {int count0,i0;while(s[i]!\0){if((s[i]!s[i1])&&(s[i]!(s[i1]32))&&(s[i]!(s[i1]-32))&&s[i1]!0)count;i;}return count; }解题思路: 初始化变量&…

免费一键图片转3D模型,AI建模,一键把图片转三维模型,二维图片转3维模型,AI建模

免费一键图片转3D模型,AI建模,一键把图片转三维模型,二维图片转3维模型,AI建模,公测版,每天不定时免费开放,非常强大 1咱们先打开ai.glbxz.com http://ai.glbxz.com 22 2导入图片。支持单张和多张图片生成…

vue3中el-table实现多表头并表格合并行或列

1、el-table中添加事件 :span-method"genderSpanCity" <el-table :span-method"genderSpanCity":data"data.tableData":fit"true" table-layout"fixed" header-align"center" stripestyle"width:100%;he…

GOAT‘S AI早鸟报Part9

资讯 英伟达重磅发布5090&#xff0c;定价15000 老黄重磅发布5090&#xff0c;定价15000&#xff01;22000元的世界最小AI超级计算机也来了 英伟达在CES发布了最新的GPU——RTX 5090&#xff0c;采用Blackwell架构&#xff0c;具备920亿个晶体管&#xff0c;4000 AI TOPS的AI…

【STM32+CubeMX】 新建一个工程(STM32F407)

相关文章&#xff1a; 【HAL库】 STM32CubeMX 教程 1 --- 下载、安装 目录 第一部分、新建工程 第二部分、工程文件解释 第三部分、编译验证工程 友情约定&#xff1a;本系列的前五篇&#xff0c;为了方便新手玩家熟悉CubeMX、Keil的使用&#xff0c;会详细地截图每一步Cu…

HTML5实现喜庆的新年快乐网页源码

HTML5实现喜庆的新年快乐网页源码 前言一、设计来源1.1 主界面1.2 关于新年界面1.3 新年庆祝活动界面1.4 新年活动组织界面1.5 新年祝福订阅界面1.6 联系我们界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现喜庆的新年快乐网页源码&#xff0c;春节新年网…

鸿蒙的APP真机调试以及发布

目录&#xff1a; 1、创建好鸿蒙项目2、创建AGC项目3、实现自动签名3.1、手动方式创建签名文件和密码 4、运行项目5、无线真机调试 1、创建好鸿蒙项目 2、创建AGC项目 &#xff08;1&#xff09;在File->Project Structure->Project->Signing Configs中进行登录。(未…

概率基本概念 --- 离散型随机变量实例

条件概率&独立事件 随机变量 - 离散型随机变量 - 非离散型随机变量 连续型随机变量奇异性型随机变量 概率表示 概率分布函数概率密度函数概率质量函数全概率公式贝叶斯公式 概率计算 数学期望方差协方差 计算实例 假设有两个离散型随机变量X和Y&#xff0c;它们代…

【Linux】Linux指令apt、systemctl、软链接、日期时区

一、apt命令 1.1 Linux系统的应用商店 操作系统安装软件有许多种方式&#xff0c;一般分为&#xff1a; 下载安装包自行安装 如win系统使用exe文件、msi文件等如mac系统使用dmg文件、pkg文件等 系统的应用商店内安装 如win系统有Microsoft Store商店如mac系统有AppStore商…

OSI模型的网络层中产生拥塞的主要原因?

&#xff08; 1 &#xff09;缓冲区容量有限&#xff1b;&#xff08; 1.5 分&#xff09; &#xff08; 2 &#xff09;传输线路的带宽有限&#xff1b;&#xff08; 1.5 分&#xff09; &#xff08; 3 &#xff09;网络结点的处理能力有限&#xff1b;&#xff08; 1 分…

C++list

1. list的介绍及使用 1.1list的介绍 list的文档介绍 1.list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双相迭代 2.list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过…

Java 日期时间格式化标准

文章目录 Java日期时间格式化符号ISO 8601中的日期时间ISO 8601标准的定义ISO 8601日期时间格式 周数年份ISO 8601中的周数年份Java中的周数年份 Java跨年日期格式化BUG注意事项 Java日期时间格式化符号 JDK官网截图&#xff1a; 格式化符号梳理&#xff1a; 符号描述符号用…

【计算机视觉】单目深度估计模型-Depth Anything-V2

概述 本篇将简单介绍Depth Anything V2单目深度估计模型&#xff0c;该模型旨在解决现有的深度估计模型在处理复杂场景、透明或反射物体时的性能限制。与前一代模型相比&#xff0c;V2版本通过采用合成图像训练、增加教师模型容量&#xff0c;并利用大规模伪标签现实数据进行学…

如何在Windows上编译OpenCV4.7.0

前言 ​ 参考&#xff1a;Win10 下编译 OpenCV 4.7.0详细全过程&#xff0c;包含xfeatures2d 这里在其基础上还出现了一些问题&#xff0c;仅供参考。 正文 一、环境 1、win10 2、cmake-gui 3、opencv4.7.0 4、VS2019 二、编译过程 1、下载需要的文件&#xff1a; 通…

ros2-4.1 服务通信介绍

服务是ROS图中节点之间的另一种通信方法。服务分为客户端和服务端&#xff0c;客户端发送请求给服务端&#xff0c;服务端可以根据客户端的请求做一些处理&#xff0c;然后返回结果给客户端。也称为为请求-响应模型。 服务和话题的不同之处&#xff0c;话题是没有返回的&#…

代码随想录算法训练营第四十天 | 股票问题

LeetCode 121.买卖股票的最佳时机&#xff1a; 文章链接 题目链接&#xff1a;121.买卖股票的最佳时机 思路 方法1&#xff1a;暴力 看到题目最直接的想法是双层遍历求最大区间差 class Solution:def maxProfit(self, prices):if len(prices) < 1:return 0result 0for…

EyeSoothe: Your Ultimate Eye Health Companion

In today’s screen-dominated world, our eyes deserve extra care. EyeSoothe is the ultimate app for anyone looking to track their vision, rejuvenate tired eyes, and find the perfect eyewear—all powered by intelligent AI and packed into one seamless app. h…

AnaConda下载PyTorch慢的解决办法

使用Conda下载比较慢&#xff0c;改为pip下载 复制下载链接到迅雷下载 激活虚拟环境&#xff0c;安装whl&#xff0c;即可安装成功 pip install D:\openai.wiki\ChatGLM2-6B\torch-2.4.1cu121-cp38-cp38-win_amd64.whl

【python】matplotlib(radar chart)

文章目录 1、功能描述和原理介绍2、代码实现3、效果展示4、完整代码5、多个雷达图绘制在一张图上6、参考 1、功能描述和原理介绍 基于 matplotlib 实现雷达图的绘制 一、雷达图的基本概念 雷达图&#xff08;Radar Chart&#xff09;&#xff0c;也被称为蛛网图或星型图&…

鸿蒙APP之从开发到发布的一点心得

引言&#xff1a; 做鸿蒙开发大概有1年左右时间了&#xff0c;从最开始的看官方文档、看B站视频&#xff0c;到后来成功发布两款个人APP&#xff08;房贷计算极简版、时简时钟 轻喷&#xff0c;谢谢&#xff09;。简单描述一下里边遇到的坑以及一些经历吧。 学习鸿蒙开发 个…