当前位置: 首页 > news >正文

override

override 是 C++11 引入的一个关键字,override 的作用是在派生类中显式地声明某个函数是用于重写基类的虚函数。它不仅仅是一个语法标记,更重要的是提供了编译时的错误检查功能,确保程序员确实按照预期在派生类中重写了基类的函数。如果没有正确地重写函数(如参数类型不匹配),编译器会抛出错误。

使用场景

当你在派生类中希望重写基类的虚函数时,通常在函数声明后加上 override 关键字。这可以确保:

  1. 基类中的函数是虚函数。
  2. 派生类中的函数正确地重写了基类中的函数(函数签名要完全一致)。

用法示例

假设有一个基类 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;
}

代码解释

  1. 基类 Animal

    • 基类 Animal 定义了两个虚函数 makeSound()move(int distance),它们可以被派生类重写。
  2. 派生类 Dog

    • Dog 类通过 override 关键字正确重写了基类的虚函数 makeSound()move(int distance)
    • 如果尝试使用不匹配的参数类型(例如 move(double distance)),编译器会报错,这就是 override 提供的安全性保证。
  3. 虚函数调用

    • main() 函数中,基类指针 animal 和派生类指针 dog 指向了不同的对象。
    • 当调用虚函数 makeSound()move() 时,dog 对象调用的是 Dog 类中重写的函数,显示了狗的行为,而不是基类的默认行为。
  4. 派生类自定义函数

    • 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 引入的一个关键字&#xff0c;override 的作用是在派生类中显式地声明某个函数是用于重写基类的虚函数。它不仅仅是一个语法标记&#xff0c;更重要的是提供了编译时的错误检查功能&#xff0c;确保程序员确实按照预期在派生类中重写了基类的函数。如果没有正确…...

万象奥科工业平板上线,邀您体验与众不同!

Vanxoak推出的全新品类——ARM工业平板电脑&#xff01;该系列工业平板具有防护等级高、接口丰富、易开发等特点&#xff0c;专为工业HMI&#xff08;人机界面&#xff09;和工业控制领域设计。整机采用高性能工业级ARM处理器&#xff0c;适配全贴合电容触摸屏&#xff0c;可选…...

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题序列化和反序列化二叉搜索树

题目&#xff1a; 题解&#xff1a; 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的美食信息推荐系统

系统展示 用户前台界面 管理员后台界面 系统背景 在数字化时代&#xff0c;随着人们对美食文化的热爱与追求不断增长&#xff0c;美食信息推荐系统成为了连接食客与美食之间的重要桥梁。面对海量的美食信息&#xff0c;用户往往难以快速找到符合个人口味和需求的美食。因此&…...

spring boot jar 分离自动部署脚本

背景 远程部署时spring boot 包&#xff0c;比较大。可以采用依赖库和业务包分离的方式。提供一个脚本进行自动部署 maven 配置分离jar包 <build><finalName>${project.artifactId}</finalName><plugins><plugin><groupId>org.springfra…...

PGMP-03战略一致性

1.概要 program strategy alignment&#xff1a;战略一致性 2.详细...

华为OD机试真题---智能成绩表

题目描述 小明来到某学校当老师&#xff0c;需要将学生按考试总分或单科分数进行排名。输入包括学生人数、科目数量、科目名称、每个学生的姓名和对应科目的成绩&#xff0c;最后输入一个用作排名的科目名称。如果输入的排名科目不存在&#xff0c;则按总分进行排序。输出一行…...

828华为云征文 | 华为云Flexus云服务器X实例搭建企业内部VPN私有隧道,以实现安全远程办公

VPN虚拟专用网络适用于企业内部人员流动频繁和远程办公的情况&#xff0c;出差员工或在家办公的员工利用当地ISP就可以和企业的VPN网关建立私有的隧道连接。 通过拨入当地的ISP进入Internet再连接企业的VPN网关&#xff0c;在用户和VPN网关之间建立一个安全的“隧道”&#xff…...

Hadoop集群的高可用(HA):NameNode和resourcemanager高可用的搭建

文章目录 一、NameNode高可用的搭建1、免密配置2、三个节点都需要安装psmisc3、检查三个节点是否都安装jdk以及zk4、检查是否安装了hadoop集群5、修改hadoop-env.sh6、修改core-site.xml7、修改hdfs-site.xml8、检查workers 文件是否为三台服务9、分发给其他两个节点10、初始化…...

支付宝沙箱环境 支付

一 什么是沙箱&#xff1a; 沙箱环境是支付宝开放平台为开发者提供的安全低门槛的测试环境 支付宝正式和沙箱环境的区别 &#xff1a; AI&#xff1a; 从沙箱到正式环境&#xff1a; 当应用程序开发完成后&#xff0c;需要将应用程序从沙箱环境迁移到正式环境。 这通常涉及…...

获取unity中prefab的中文文本内容以及和prefab有关的问题

背景1&#xff1a;经常会在开发中遇到策划需要改某个界面&#xff0c;但是我们不知道那是什么界面&#xff0c;只看到一些关键字比如圣诞活动&#xff0c;那这样我就可以轻易找到这个预设了。另外还可以扩展就是收集项目中的所有中文文本然后归集到多语言表中&#xff0c;然后接…...

Web自动化中常用XPath定位方式

在进行Web自动化测试时&#xff0c;元素定位是一个至关重要的环节。XPath&#xff08;XML Path Language&#xff09;是一种用于在XML文档中定位节点的语言。在Web自动化中&#xff0c;XPath广泛应用于定位HTML元素。本文将详细介绍几种常用的XPath定位方式&#xff0c;包括绝对…...

Unity3D播放GIF图片使用Animation来制作动画

系列文章目录 unity工具 文章目录 系列文章目录👉前言👉一、下载GIF动图,用PS制作导出帧动画图片👉二、使用Animation制作动画👉三、脚本控制动画播放👉壁纸分享👉总结👉前言 unity播放gif图片,本身是不支持的,但是可以使用其他方法来实现, 1.有一种使用System…...

redo log 和 bin log 的两阶段提交

两阶段提交的过程 当事务提交后&#xff0c;有一个两阶段提交策略。 在开启两阶段提交时&#xff0c;会开启一个 XA 事务&#xff08;宏观上的事务&#xff09;&#xff0c; Prepare 阶段&#xff1a;将 redo log 的状态设置为 prepare&#xff0c;然后将 事务XID 写入 redo…...

Go基础学习07-map注意事项;多协程对map的资源竞争;sync.Mutex避免竟态条件

文章目录 Go中map使用以及注意事项map使用时的并发安全问题 Go中map使用以及注意事项 Go语言中map使用简单示例&#xff1a; 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&#xff0c;在服务器的zrcs文件夹下直接下载anaconda&#xff08;很慢&#xff09;&#xff1a; wget https://repo.anaconda.com/archive/Anaconda3-2024.06-1-Linux-x86_64.sh 或者选择本地下载&#xff0c;清华大学开源软件镜像站&#xff1a;https:/…...

什么是IIC通信协议?

IIC&#xff08;Inter-Integrated Circuit&#xff09;通信协议&#xff0c;又称为I2C&#xff08;Inter-Integrated Circuit 2&#xff09;协议&#xff0c;是一种广泛使用的串行通信协议。它由飞利浦半导体公司&#xff08;现NXP Semiconductors&#xff09;开发&#xff0c;…...

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稳定版)

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…...

基于springboot的中医院问诊知识科普系统的设计与实现-vue

目录系统架构设计前端技术选型模块划分关键技术实现开发阶段规划部署方案项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作系统架构设计 采用前后端分离架构&#xff0c;前端使用Vue.js框架&#xff0c;后端基于SpringBoot构建R…...

【模型手术室】第七篇:模型量化 —— 从 FP16 到 4-bit 的极限压缩与性能翻倍

专栏进度&#xff1a;07 / 10 (微调实战专题) 大模型默认使用 FP16&#xff08;16 位浮点数&#xff09; 存储权重&#xff0c;这意味着每个参数占 2 字节。一个 7B 模型光权重就占 14GB 显存。量化的本质是把这些高精度的数字映射到更小的整数空间&#xff08;如 INT4&#xf…...

3步在Mac上免费运行Stable Diffusion的终极指南

3步在Mac上免费运行Stable Diffusion的终极指南 【免费下载链接】MochiDiffusion Run Stable Diffusion on Mac natively 项目地址: https://gitcode.com/gh_mirrors/mo/MochiDiffusion 还在为寻找合适的Mac AI绘画工具而烦恼吗&#xff1f;想要完全离线生成惊艳的AI艺术…...

Phi-4-Reasoning-Vision应用场景:法律文书配图证据链推理系统

Phi-4-Reasoning-Vision应用场景&#xff1a;法律文书配图证据链推理系统 1. 法律文书配图证据链推理系统概述 在法律实务中&#xff0c;证据链的构建往往需要处理大量图文混合材料。传统人工分析方式存在效率低下、主观性强、容易遗漏细节等问题。基于Phi-4-Reasoning-Visio…...

Pencil:重新定义设计与开发的边界

&#x1f3a8; Pencil&#xff1a;重新定义设计与开发的边界 更多问题讨论和资料获取&#xff0c;请关注文章最后的微信公众号 当"设计即代码"成为现实&#xff0c;前端开发者的工作流正在经历一场革命 &#x1f4d6; 什么是 Pencil&#xff1f; 如果你是一名前端开…...

快马平台快速原型:十分钟用AI生成你的第一个龙虾养殖系统Docker部署方案

最近在研究如何用Docker快速搭建一个龙虾养殖模拟系统&#xff0c;发现用InsCode(快马)平台可以大大简化这个过程。作为一个快速原型验证工具&#xff0c;它让我在十分钟内就完成了从构思到部署的全流程。下面分享下我的实践心得&#xff1a; 项目构思阶段 这个模拟系统需要展示…...

JDK24虚拟线程pinning问题终于解决了!手把手教你如何避免同步代码块阻塞

JDK24虚拟线程pinning问题深度解析与实战优化指南 虚拟线程作为Java平台近年来最重要的并发模型革新&#xff0c;从JDK21的初次亮相到JDK24的成熟完善&#xff0c;已经逐步改变了Java开发者处理高并发的思维方式。本文将带您深入理解pinning问题的本质&#xff0c;掌握JDK24中的…...

如何用LeetDown实现iOS设备降级?3个步骤轻松搞定

如何用LeetDown实现iOS设备降级&#xff1f;3个步骤轻松搞定 【免费下载链接】LeetDown a GUI macOS Downgrade Tool for A6 and A7 iDevices 项目地址: https://gitcode.com/gh_mirrors/le/LeetDown 还在为老旧iOS设备升级后卡顿烦恼吗&#xff1f;想让iPhone 5s或iPad…...

Redis监听Key过期事件报错?教你两种绕过CONFIG命令的实用方案

Redis监听Key过期事件的两种安全实践方案 Redis的Key过期事件监听是许多业务场景中的核心需求&#xff0c;比如订单超时处理、会话管理、缓存刷新等。但在云服务环境中&#xff0c;开发者常会遇到ERR unknown command CONFIG的报错&#xff0c;这通常是因为云服务提供商出于安全…...

RPA-Python与pytest-microsoftgraph-python-sdk集成:pytest-microsoftgraph-python-sdk测试自动化

RPA-Python与pytest-microsoftgraph-python-sdk集成&#xff1a;pytest-microsoftgraph-python-sdk测试自动化 【免费下载链接】RPA-Python Python package for doing RPA 项目地址: https://gitcode.com/gh_mirrors/rp/RPA-Python RPA-Python是一款强大的Python RPA工具…...