走进C++11(四)override/final

C++11中override关键字使用 什么是override? override 是C++11引进的一个说明符,翻译为 覆盖 的意思。C++11 中的 override 关键字,可以显式的在派生类中声明,哪些成员函数需要被重写,如果没被重写,则编译器会报错。 override有什么用? 在我们C++编程过程中,最熟悉的就是对接口方法的实现,在接口中一般只是对方法进行了声明(declaration),而我们在实现时,就需要实现接口声明的所有方法。 在程序中加override 关键字,可以避免派生类中忘记重写虚函数的错误。 另一个典型.. 阅读详情

                      ---清明时节雨纷纷,路上行人欲断魂。借问酒家何处有?牧童遥指杏花村。

 

今天是一年一度的清明节,各大网站纷纷跟进号召,仿佛世界都变成了黑白的。在这个特殊的节日里我们谈谈和继承控制。

 

这两个关键字并不能提升程序性能也不会影响程序逻辑,他们存在的作用就是控制继承关系。

 

override

 

描述:override是C++11中的一个继承控制关键字。override确保在派生类中声明的重载函数跟基类的虚函数有相同的声明。

 

override明确地表示一个函数是对基类中一个虚函数的重载。更重要的是,它会检查基类虚函数和派生类中重载函数的签名不匹配问题。如果签名不匹配,编译器会发出错误信息。 

 

override表示函数应当重写基类中的虚函数(用于派生类的虚函数中) 。

 

目的:

 

  • 在函数比较多的情况下可以提示读者某个函数重写了基类虚函数(表示这个虚函数是从基类继承,不是派生类自己定义的);

  • 强制编译器检查某个函数是否重写基类虚函数,如果没有则报错。

 

用法:在类的成员函数参数列表后面添加该关键字既可。

 

下面举个小例子:

 

struct A{virtual void foo();void bar();};struct B : A{void foo() const override; // Error: B::foo does not override A::foo// (signature mismatch)void foo() override; // OK: B::foo overrides A::foovoid bar() override; // Error: A::bar is not virtual};

 

根据注释,我们可以很清晰的理解这个关键字的意思。有些人可能认为这个关键字没啥用。自己写程序的时候注意一下就好了,不必要用这个关键字。一开始我也是这么以为的,知道有一天我跌进了这个坑里。

 

故事是这样的。之前写过一个程序,大概是这样的:

 

struct A{virtual void foo();void fooo();};struct B : A{void foo(){...}//这个是之前别人写的void fooo(){...}//这个是我后加的};

 

当然当时的程序很复杂,我想调用foo然后从B中重写的foo。但是foo和fooo长的特别像我其实实现了fooo,结果调用foo,发现写的程序一直不生效。调试半天也无果。。。。后来发现是写错了,如果当时写上这个关键字,编译就会立马报错,不会花费大量时间debug。。。

 

final

 

final阻止类的进一步派生和虚函数的进一步重写。这个很简单,举个小例子就明白了:

 

struct Base{virtual void foo();};struct A : Base{void foo() final; // A::foo is overridden and it is the final overridevoid bar() final; // Error: non-virtual function cannot be overridden or be final};struct B final : A // struct B is final{void foo() override; // Error: foo cannot be overridden as it's final in A};struct C : B // Error: B is final{};

 

我建议在写程序的时候尽量在合适的地方用这两个关键字,这样就能在程序编译的时候就发现隐藏的错误。

 

下期预告:

 

下期聊一聊继承构造和委托构造

 

关注公众号获取更多信息:

C++ override使用详解 C++ override从字面意思上,是覆盖的意思,实际上在C++中它是覆盖了一个方法并且对其重写,从而达到不同的作用。在我们C++编程过程中,最熟悉的就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法。还有一个典型应用就是在继承中也可能会在子类覆盖父类的方法。       公有继承包含两部分:一是“接口”(interface),二是 "实现" 阅读详情

相关推荐

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

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

m0_62599305的博客 4207

C++ 关于override关键字使用详解

因此,只要函数签名相同,派生类的函数就可以覆盖基类的函数,无论这两个函数的实现是否相同。这就是前面所说的,普通虚函数同时继承接口和缺省实现是危险的,最好是基类中实现缺省行为 (behavior),但只有在派生类要求时才提供该缺省行为.一种方法是 纯虚函数 + 缺省实现,因为是纯虚函数,所以只有接口被继承,其缺省的实现不会被继承。这是因为非虚函数是 “静态绑定” 的,p1被声明的是 Person* 类型的指针,则通过 p1调用的非虚函数都是基类中的,既使 指向的是派生类。

nihao_2014的博客 1万+

AXI Timer IP核使用说明

AXI Timer是提供定时技术功能的集成IP核,具有时间生成、事件捕获、产生PWM波以及产生中断的功能,下面具体讲述Timer IP核的使用说明。

weixin_43418104的博客 2488

C++-[override]关键字使用详解

本文介绍了C++ override关键字使用详解以及与重载的区别。

沐槿的博客 5万+

Mac查看以太网信息,IP地址,查看配置桥接网络,使得虚拟机和本机ping通--linux系统part

4. 在本机的终端中使用ping命令,查看是否能够ping通虚拟机系统,如下图所示已经ping通。3-查看IP为192.168.1.244,还可以看到一些具体信息,如TCP/IP,DNS等;2-打开centos,进入管理员root模式(使用su命令加上输入管理员密码)然后使用ifconfig命令查看端口地址,如下所示为192.168.1.248。3-在虚拟机内使用ping命令,测试是否和网络连通,如下图所示已经ping通。打开虚拟机设置-点击网络适配器-选择桥接网络。1-打开设置,选择网络。

m0_65485230的博客 1549

零基础实战:YOLO检测头自定义替换全攻略

本文为零基础用户提供了YOLO检测头自定义替换的完整实战指南。通过将检测头比作汽车的“方向盘”,文章详细阐述了为何需要替换、如何寻找和集成新检测头模块、修改配置文件以及最终训练验证的全过程,旨在帮助用户针对特定任务(如小目标检测)提升模型性能。

perl8的博客 255

C++11 中 final 和 override 从入门到精通

final和override是 C++11 引入的两个非常有用的关键字,它们为类的继承和多态机制提供了更多的控制权和明确性。final关键字用于指示一个类或成员函数不能被继承或覆盖,而override关键字用于明确指出派生类中的成员函数旨在覆盖基类中的同名虚拟函数。通过对final和override关键字的理解和运用,我们可以更加安全、清晰地设计和实现 C++ 程序。在实际开发中,合理地使用这两个关键字可以提高代码的可读性、安全性和可维护性,避免一些潜在的错误。希望本文能帮助你更好地掌握final和。

码事漫谈 1160

新入手的Atmel-ICE产品说明

【一句话自我介绍】 我是Atmel最新推出的功能强大的调试编程工具,适用于Atmel ARM® Cortex®-M的Atmel SAM和AVR® 系列芯片。 【我支持的软件】 完美支持Atmel Studio 6.2以上版本直接支持ICC8AVR以上版本支持烧录ICCAVR、CVAVR、IAR等生成的HEX文件 【我支持的器件】 支持AVR 32-bit MCUs的JTA

kaloha3的专栏 1万+

override和final那些事

override 和 final 都能帮助我们改善虚函数相关的安全性;而使用final需要更多的权衡,但是override就放心大胆地用吧。

weixin_45883112的博客 2438

SAP系统中PP模块全配置文档

配置路径IMG>SAP NetWeaver>常规设置>维护日历>工厂日历事务代码SCAL要求传输工厂代码描述日历代码日历描述起始日期星期一星期二星期三星期四星期五星期六星期日有效开始日期有效结束日期1000南微医学工厂MT南微医学工厂日历√√√√√√√201820502.4定义工厂配置路径IMG>生产>物料清单>常规数据>定义BOM状态事务代码OS23要求传输配置路径IMG>生产>主数据>资源>常规数据>标准值>定义参数。

yanzibing99的博客 1894

会计引擎:交易与核算分离的前世今生

一、为什么需要会计引擎 金融产品的设计,一如一块硬币需要兼顾两面:一面是为客户提供好的金融服务,满足客户支付结算、借贷、资产保值增值等方面的需求,并在这个过程中,以数字化的方式做好客户资产的登记,登记的载体,则是“分户”或“台账”,如客户存款户,是一种典型的分户--资金的增减变化都在一个账户中进行体现,而客户购买的银行理财,因为收益率、期限、投资标的不同,每一笔持有就形成一行记录,即为“台账”--这当然是不严谨但相对形象的表述。但是,“分户”和“台账”并没有必然的区别,以贷款为例,一些银行仍然存在所谓“

银行信息系统应用架构详解 985

C++11 关键字override和final

C++11之前,一直没有继承控制关键字。禁用一个类的进一步衍生是可能的但也很棘手。为避免用户在派生类中重载一个虚函数,你不得不向后考虑。 C++ 11添加了两个继承控制关键字:override和final。 override确保在派生类中声明的重载函数跟基类的虚函数有相同的签名。 final阻止类的进一步派生和虚函数的进一步重载。 final关键字 一个派生类可以重载在基类中声明的成员函数,这是面...

xupeng1644的博客 2106

学Simulink--基于Simulink的无迹卡尔曼滤波(UKF)目标跟踪仿真建模示例

本文详细介绍了基于Simulink的无迹卡尔曼滤波(UKF)目标跟踪仿真建模方法。首先分析了UKF相比EKF在强非线性场景下的优势,包括无线性化误差、计算效率高和鲁棒性强等特点。接着阐述了UKF的核心原理,重点讲解了无迹变换(UT)的三个关键步骤:Sigma点生成、非线性传播和加权统计重构。文章还详细说明了二维机动目标的状态向量定义、非线性状态转移模型和雷达观测模型。 在Simulink实现部分,提供了完整的建模步骤和核心代码,包括目标运动模型、雷达传感器模型和UKF算法模块的实现。通过蛇形机动场景的仿真实

xiaoheshang_123的博客 89

C++ override和final详解

像这样的场景,我们也没有工具来区分告诉编译器我们的本意是否向覆写这个父类的虚函数。因此,在C++11中,我们引入了。在所有的子类中查找重载的函数这件事可真的是很麻烦,而且墨菲定律告诉你:你永远会忘掉你搞错了的那一个子类。针对上面特性的反面,C++11也他讨论了如何防止子类再覆写父类的虚函数了——即父类的某些特性或方法被设计成不想再被改变。,他还会给你带来一个意想不到的收获:在C++11之前,关于子类覆写父类虚函数后,子类的虚函数还要不要加。之后,这个关键字本身就起了这个作用,之前的做法也就不是必须的了。

qq_27898413的博客 1537

【MT7628】固件开发-SDK4320添加MT7612E WiFi驱动操作说明

【MT7628】固件开发-SDK4320添加MT7612E WiFi驱动操作说明

wgl307293845的博客 2079

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C++11 final 与 override 的用法

final final 是 C++11 新标准的一个关键字! 只有支持C++11新标准的IDE才可以使用! final 有什么作用? 用来修饰类,使该类不能被继承; 用来修饰类的虚函数,使得该虚函数在子类中,不能被重写。 理解:终结fianl所修饰过的任何东西。 一、用来修饰类,使该类不能被继承 代码: #include <iostream> class XiaoMi {...

cpp_learner的博客 1374

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C++11 的新特性 ——final override default

注意事项。

weixin_70822378的博客 775

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C++11 新特性:final 和 override

final和override这两个关键字的引入,使得C++ 在面向对象编程方面的能力更加完善。通过使用final,类的设计者可以控制类的继承关系和虚函数的重写行为,而override则强化了派生类对基类虚函数重写的准确性,避免了因签名不匹配而导致的错误。这两个关键字的使用,提高了C++程序的安全性、清晰度和维护性。

kelvin_yin的专栏 1007

C++11新特性:final与override关键字

上述例中,我们所期望的是重写基类中的function函数,但是由于无意间的参数错误,导致我们所期望的函数并没有被重写,而编译器却并没有给出任何错误警告,如果一直没有察觉这个潜藏的错误,后果可能不堪设想。问题的答案是肯定的。而在其某一级派生类中,我们发现其功能已经趋于圆满了,不需要再对其进行重写了,此时便可以使用final将其约束起来,防止其下的派生类无意之间对其进行了修改。这两个新特性的引入进一步加强了面向对象编程中的继承机制,提升代码的可读性和安全性,同时也能很好的防止在类编程中的一些潜在的问题。

R6bandito的博客 1385

C++11 标识符:override 和 final

C++11引入override和final标识符来解决虚函数重写中的常见问题。override确保派生类函数正确覆盖基类虚函数,若签名不匹配则编译报错;final用于禁止类被继承或虚函数被重写。使用override时不必再加virtual关键字,只需在函数声明后添加override即可。这两个标识符能有效避免无意识重写和签名错误,提高代码安全性。典型应用场景包括:明确重写意图、防止意外创建新虚函数、限制类继承和虚函数重写。正确使用这两个标识符可以显著减少运行时错误。

人无远虑,必有近忧 779

[C++11] override 与 final

目录overridefinal override 与 final 是 c++11中的 说明符(specifier) override 参考页面:https://zh.cppreference.com/w/cpp/language/override 作用:指定一个虚函数覆盖另一个虚函数。 class A { virtual void foo(); void bar(); }; ...

nothing的博客 350

【C++11】final与override关键字和类的新功能

final与override关键字和类的新功能详解

枫叶先生的博客 1478

final/override/=default/=delete 语法

final、override、=default、=delete 是 C++11 添加的一组非常具有标记意义的新语法,我们来逐一介绍它们。 FINAL 关键字 final 关键字修饰一个类,这个类将不允许被继承,这在其他语言(如 Java)中早就实现了。在 C++ 11 中 final 关键字要写在类名的后面,其他语言是写在 class 关键字的前面。示例如下: class A final { ...

weixin_42226134的博客 2406

C++11 新增语法剖析

带你一命通关 C++11 新增语法 十分钟通透 C++11

qq_61500888的博客 3406

C++中的final和override关键字详解

可以在编译时进行检查,确保派生类中的函数确实是基类中虚函数的重写版本。可以确保某个类不被继承,这在设计中有时候是有必要的,例如为了保护某些核心功能不被修改或破坏。是两个关键字,用于对类和类成员进行修饰,提供了更强的编译时检查和更灵活的代码设计。用于修饰类,表示该类不能被继承。它将该类标记为最终类,禁止其他类从它派生。可以帮助确保派生类正确地重写了基类中的虚函数,提高代码的可读性和可维护性。用于标记派生类中的虚函数,确保它是基类中虚函数的重写版本。用于修饰虚函数,表示该虚函数在派生类中不能被重写。

N阶二进制的博客 1916

C++11强类型枚举,override/final

C++11(一)开篇 这个系列主要介绍C++11的一些新的特性,C++11问世至今已经有将近十年了。但是许多公司仍然停留在C++98上。之前在部门分享过C++11的知识,在这里分享给有需要的人。 C++是一门伟大的语言,永远给程序员最大的设计自由, 未使用的特性从不产生副作用,新版本永远完全兼容旧版本。C++11先前被称作C++0x,即ISO/IEC 14882:2011,是C++编程语言的一个标准。 之前的C++标准包括C++98、C++03。虽然此后的[C++14]才是C++的现行标准,但C++1

yizhiniu_xuyw的专栏 650
上一篇: 走进C++11(三)“类” 类型的union
下一篇: 走进C++11(五) 继承构造
Max_Cong
博客等级 码龄10年 281粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值