override
override 是 C++11 引入的一个关键字,override 的作用是在派生类中显式地声明某个函数是用于重写基类的虚函数。它不仅仅是一个语法标记,更重要的是提供了编译时的错误检查功能,确保程序员确实按照预期在派生类中重写了基类的函数。如果没有正确地重写函数(如参数类型不匹配),编译器会抛出错误。
使用场景
当你在派生类中希望重写基类的虚函数时,通常在函数声明后加上 override 关键字。这可以确保:
- 基类中的函数是虚函数。
- 派生类中的函数正确地重写了基类中的函数(函数签名要完全一致)。
用法示例
假设有一个基类 Base,其中定义了一个虚函数 virtual void func()。
class Base {
public:virtual void func() {std::cout << "Base function" << std::endl;}
};
如果要在派生类 Derived 中重写该虚函数,可以使用 override 关键字:
class Derived : public Base {
public:void func() override {std::cout << "Derived function" << std::endl;}
};
在这个例子中,Derived 类的 func 函数明确标记为重写了 Base 类的 func 函数。如果派生类中的函数签名与基类不匹配,编译器会报错。例如:
class Derived : public Base {
public:void func(int x) override { // 错误:签名与基类不匹配std::cout << "Derived function" << std::endl;}
};
这个错误会被及时发现,因为 func(int x) 的签名与基类的 func() 不匹配,编译器会指出这是不合法的重写。
关键点总结
override用于确保虚函数的正确重写,避免签名不匹配问题。- 它能提高代码的可读性和可维护性,便于他人理解代码中的继承关系。
下面通过一个具体的代码实例展示了 override 的使用,以及它在派生类中防止函数签名不匹配和提高代码可读性等方面的作用。
示例代码
#include <iostream>// 基类
class Animal {
public:// 基类中的虚函数virtual void makeSound() const {std::cout << "Animal makes a sound." << std::endl;}// 基类中的虚函数virtual void move(int distance) const {std::cout << "Animal moves " << distance << " meters." << std::endl;}
};// 派生类
class Dog : public Animal {
public:// 正确重写基类中的 makeSound 函数void makeSound() const override {std::cout << "Dog barks." << std::endl;}// 错误重写:这里 move 函数的参数类型不匹配// void move(double distance) const override { // 如果这样写,编译器会报错,因为参数类型与基类不匹配// std::cout << "Dog runs " << distance << " meters." << std::endl;// }// 正确重写基类中的 move 函数void move(int distance) const override {std::cout << "Dog runs " << distance << " meters." << std::endl;}// 自己定义的新函数,不重写基类void wagTail() const {std::cout << "Dog wags its tail." << std::endl;}
};int main() {Animal* animal = new Animal();Animal* dog = new Dog();// 调用基类的虚函数animal->makeSound(); // 输出: Animal makes a sound.dog->makeSound(); // 输出: Dog barks. (派生类重写的版本)animal->move(10); // 输出: Animal moves 10 meters.dog->move(20); // 输出: Dog runs 20 meters. (派生类重写的版本)// 直接调用派生类的非虚函数// animal->wagTail(); // 错误,Animal 没有定义 wagTailstatic_cast<Dog*>(dog)->wagTail(); // 输出: Dog wags its tail.delete animal;delete dog;return 0;
}
代码解释
-
基类
Animal:- 基类
Animal定义了两个虚函数makeSound()和move(int distance),它们可以被派生类重写。
- 基类
-
派生类
Dog:Dog类通过override关键字正确重写了基类的虚函数makeSound()和move(int distance)。- 如果尝试使用不匹配的参数类型(例如
move(double distance)),编译器会报错,这就是override提供的安全性保证。
-
虚函数调用:
- 在
main()函数中,基类指针animal和派生类指针dog指向了不同的对象。 - 当调用虚函数
makeSound()和move()时,dog对象调用的是Dog类中重写的函数,显示了狗的行为,而不是基类的默认行为。
- 在
-
派生类自定义函数:
Dog类还定义了自己的函数wagTail(),它不是重写基类中的函数,无法通过基类指针调用。
编译器报错示例
如果 Dog 类中的 move 函数定义为:
void move(double distance) const override { // 错误:函数签名不匹配 std::cout << "Dog runs " << distance << " meters." << std::endl; }
编译器会报错,因为基类中的 move 函数参数是 int 类型,而这里的参数是 double 类型。使用 override 关键字后,编译器会检查重写是否正确,从而帮助程序员发现这些潜在的错误。
总结,通过这个代码实例可以看到,override 能确保派生类中的函数与基类虚函数签名匹配,防止因疏忽引发的重写错误,并且提高代码的可读性和安全性。
相关文章:
override
override 是 C11 引入的一个关键字,override 的作用是在派生类中显式地声明某个函数是用于重写基类的虚函数。它不仅仅是一个语法标记,更重要的是提供了编译时的错误检查功能,确保程序员确实按照预期在派生类中重写了基类的函数。如果没有正确…...
万象奥科工业平板上线,邀您体验与众不同!
Vanxoak推出的全新品类——ARM工业平板电脑!该系列工业平板具有防护等级高、接口丰富、易开发等特点,专为工业HMI(人机界面)和工业控制领域设计。整机采用高性能工业级ARM处理器,适配全贴合电容触摸屏,可选…...
java将word转pdf
总结 建议使用aspose-words转pdf,poi的容易出问题还丑… poi的(多行的下边框就不对了) aspose-words的(基本和word一样) poi工具转换 <!-- 处理PDF --><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres…...
Golang | Leetcode Golang题解之第449题序列化和反序列化二叉搜索树
题目: 题解: type Codec struct{}func Constructor() (_ Codec) { return }func (Codec) serialize(root *TreeNode) string {arr : []string{}var postOrder func(*TreeNode)postOrder func(node *TreeNode) {if node nil {return}postOrder(node.Le…...
基于SpringBoot+Vue+MySQL的美食信息推荐系统
系统展示 用户前台界面 管理员后台界面 系统背景 在数字化时代,随着人们对美食文化的热爱与追求不断增长,美食信息推荐系统成为了连接食客与美食之间的重要桥梁。面对海量的美食信息,用户往往难以快速找到符合个人口味和需求的美食。因此&…...
spring boot jar 分离自动部署脚本
背景 远程部署时spring boot 包,比较大。可以采用依赖库和业务包分离的方式。提供一个脚本进行自动部署 maven 配置分离jar包 <build><finalName>${project.artifactId}</finalName><plugins><plugin><groupId>org.springfra…...
PGMP-03战略一致性
1.概要 program strategy alignment:战略一致性 2.详细...
华为OD机试真题---智能成绩表
题目描述 小明来到某学校当老师,需要将学生按考试总分或单科分数进行排名。输入包括学生人数、科目数量、科目名称、每个学生的姓名和对应科目的成绩,最后输入一个用作排名的科目名称。如果输入的排名科目不存在,则按总分进行排序。输出一行…...
828华为云征文 | 华为云Flexus云服务器X实例搭建企业内部VPN私有隧道,以实现安全远程办公
VPN虚拟专用网络适用于企业内部人员流动频繁和远程办公的情况,出差员工或在家办公的员工利用当地ISP就可以和企业的VPN网关建立私有的隧道连接。 通过拨入当地的ISP进入Internet再连接企业的VPN网关,在用户和VPN网关之间建立一个安全的“隧道”ÿ…...
Hadoop集群的高可用(HA):NameNode和resourcemanager高可用的搭建
文章目录 一、NameNode高可用的搭建1、免密配置2、三个节点都需要安装psmisc3、检查三个节点是否都安装jdk以及zk4、检查是否安装了hadoop集群5、修改hadoop-env.sh6、修改core-site.xml7、修改hdfs-site.xml8、检查workers 文件是否为三台服务9、分发给其他两个节点10、初始化…...
支付宝沙箱环境 支付
一 什么是沙箱: 沙箱环境是支付宝开放平台为开发者提供的安全低门槛的测试环境 支付宝正式和沙箱环境的区别 : AI: 从沙箱到正式环境: 当应用程序开发完成后,需要将应用程序从沙箱环境迁移到正式环境。 这通常涉及…...
获取unity中prefab的中文文本内容以及和prefab有关的问题
背景1:经常会在开发中遇到策划需要改某个界面,但是我们不知道那是什么界面,只看到一些关键字比如圣诞活动,那这样我就可以轻易找到这个预设了。另外还可以扩展就是收集项目中的所有中文文本然后归集到多语言表中,然后接…...
Web自动化中常用XPath定位方式
在进行Web自动化测试时,元素定位是一个至关重要的环节。XPath(XML Path Language)是一种用于在XML文档中定位节点的语言。在Web自动化中,XPath广泛应用于定位HTML元素。本文将详细介绍几种常用的XPath定位方式,包括绝对…...
Unity3D播放GIF图片使用Animation来制作动画
系列文章目录 unity工具 文章目录 系列文章目录👉前言👉一、下载GIF动图,用PS制作导出帧动画图片👉二、使用Animation制作动画👉三、脚本控制动画播放👉壁纸分享👉总结👉前言 unity播放gif图片,本身是不支持的,但是可以使用其他方法来实现, 1.有一种使用System…...
redo log 和 bin log 的两阶段提交
两阶段提交的过程 当事务提交后,有一个两阶段提交策略。 在开启两阶段提交时,会开启一个 XA 事务(宏观上的事务), Prepare 阶段:将 redo log 的状态设置为 prepare,然后将 事务XID 写入 redo…...
Go基础学习07-map注意事项;多协程对map的资源竞争;sync.Mutex避免竟态条件
文章目录 Go中map使用以及注意事项map使用时的并发安全问题 Go中map使用以及注意事项 Go语言中map使用简单示例: func main() {var mp map[string]int// mp : map[string]int{}val, ok : mp["one"]if ok {fmt.Println(val)} else {fmt.Println(val)}mp[…...
远程服务器安装anaconda并创建虚拟环境
1、承接上文新用户zrcs,在服务器的zrcs文件夹下直接下载anaconda(很慢): wget https://repo.anaconda.com/archive/Anaconda3-2024.06-1-Linux-x86_64.sh 或者选择本地下载,清华大学开源软件镜像站:https:/…...
什么是IIC通信协议?
IIC(Inter-Integrated Circuit)通信协议,又称为I2C(Inter-Integrated Circuit 2)协议,是一种广泛使用的串行通信协议。它由飞利浦半导体公司(现NXP Semiconductors)开发,…...
P3131 [USACO16JAN] Subsequences Summing to Sevens S Python题解
[USACO16JAN] Subsequences Summing to Sevens S 题目描述 Farmer John’s N N N cows are standing in a row, as they have a tendency to do from time to time. Each cow is labeled with a distinct integer ID number so FJ can tell them apart. FJ would like to ta…...
鸿蒙NEXT开发-ArkUI(基于最新api12稳定版)
注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下 如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…...
MPI并行编程避坑指南:实现Cannon算法时,你的进程通信真的高效吗?
MPI并行编程实战:Cannon算法性能调优的五大关键陷阱 当你第一次在集群上运行Cannon算法时,是否遇到过这样的场景:代码逻辑完全正确,计算结果也准确无误,但性能提升却远低于预期?或者更糟——程序莫名其妙地…...
通道分割并行处理改进YOLOv26双路径特征提取与计算效率双重优化
通道分割并行处理改进YOLOv26双路径特征提取与计算效率双重优化 引言 在目标检测领域,特征提取的效率和质量直接影响模型的性能表现。传统的卷积神经网络通常采用串行处理方式,所有通道共享相同的卷积核参数,这种设计虽然简单高效ÿ…...
Phi-4-reasoning-vision-15B入门必看:视觉推理模型prompt工程要点
Phi-4-reasoning-vision-15B入门必看:视觉推理模型prompt工程要点 如果你刚接触Phi-4-reasoning-vision-15B,可能会发现一个奇怪的现象:有时候它像个博学的学者,能精准分析复杂的图表;有时候却像个固执的程序员&#…...
比迪丽SDXL模型GPU算力适配:A10/A100/V100/T4多卡实测报告
比迪丽SDXL模型GPU算力适配:A10/A100/V100/T4多卡实测报告 1. 引言 如果你玩过AI绘画,肯定遇到过这样的问题:同一个模型,为什么在别人的电脑上跑得飞快,在自己这儿却慢如蜗牛?生成一张图要等好几分钟&…...
nli-distilroberta-base部署教程:Docker镜像免配置运行DistilRoBERTa NLI API
nli-distilroberta-base部署教程:Docker镜像免配置运行DistilRoBERTa NLI API 1. 项目介绍 nli-distilroberta-base是一个基于DistilRoBERTa模型的自然语言推理(NLI)Web服务。它能帮你快速判断两个句子之间的关系,特别适合需要分析文本逻辑关系的应用场…...
2026知识付费SaaS平台实测对比:创客匠人综合首选,拆解行业标杆的硬核实力
随着知识付费市场规模持续扩张,艾媒咨询数据显示,2026年中国知识付费市场规模将突破3000亿元,用户规模超6.4亿人。面对激烈的竞争,如何选择一款功能全面、稳定可靠的SaaS平台成为内容创作者和机构的核心痛点。功能卡顿、获客成本高…...
保姆级教程:在RT-Thread Studio中为AT32F437配置LAN8720以太网(从驱动使能到ifconfig测试)
从零构建AT32F437以太网通信:RT-Thread Studio与LAN8720全流程实战指南 当AT32F437这颗高性能MCU遇上RT-Thread的实时操作系统,再配合LAN8720这颗经典的以太网物理层芯片,能碰撞出怎样的火花?作为嵌入式开发者,实现设备…...
避免技术债:Agent 代码库的模块化设计与工程规范
避免技术债:Agent 代码库的模块化设计与工程规范 关键词 Agent技术栈、技术债消解、模块化第一性原理、分层-事件驱动架构、多Agent协作规范、DevOps for AI Agents、可持续迭代工程实践摘要 本文以「Agent代码库的技术债本质」为第一性原理切入点,系统性…...
SentenceTransformer:计算句子嵌入的模型
原文:towardsdatascience.com/sentencetransformer-a-model-for-computing-sentence-embedding-e8d31d9e6a8f 在这篇帖子中,我们探讨了 2019 年发布的 SentenceTransformer [1],它具有双编码器架构,并将 BERT 调整为产生高效的句子…...
seo在线分析技巧有哪些
SEO在线分析技巧有哪些? 在当今的数字化时代,搜索引擎优化(SEO)已经成为了每一个网站和在线业务的关键。特别是在百度这样的中文搜索引擎平台上,掌握SEO在线分析技巧对提升网站的可见度和流量至关重要。具体有哪些SEO…...
