C++11特性之override和final关键字

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

C++11之前,一直没有继承控制关键字。禁用一个类的进一步衍生是可能的但也很棘手。为避免用户在派生类中重载一个虚函数,你不得不向后考虑。

C++ 11添加了两个继承控制关键字:override和final。override确保在派生类中声明的重载函数跟基类的虚函数有相同的签名。final阻止类的进一步派生和虚函数的进一步重载。

虚函数重载

一个派生类可以重载在基类中声明的成员函数,这是面向对象设计的基础。然而像重载一个函数这么简单的操作也会出错。关于重载虚函数的两个常见错误如下: 
无意中重载 
签名不匹配

首先,我们来分析一下无意中重载的综合症。你可能只是通过声明了一个与基类的某个虚成员函数具有相同的名字和签名的成员函数而无意中重载了这个虚函数。编译器和读代码的人很难发现这个bug因为他们通常以为这个新函数是为了实现对基类函数的重载:

class A
{
 public:
    virtual void func();
};            
class B: A{};
class F{};
class D: A, F
{
 public:
  void func();//meant to declare a new function but

 //accidentally overrides A::func};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

阅读以上代码,你不能确定成员函数D::func()是否故意重载了A::func().它也可能是个偶然发生的重载,因为两个函数的参数列表和名字都碰巧一样。

签名不匹配是一个更为常见的情景。这导致意外创建一个新的虚函数(而不是重载一个已存在的虚函数),正如以下例子所示:

class  G
{
public:
 virtual void func(int);
};

class H: G
{
public:
 virtual void func(double); 
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

这种情况下,程序员本打算在类H中重载G::func()的。然而,由于H::func()拥有不同的签名,结果创建了一个新的虚函数,而非对基类函数的重载:

H *p=new H;
p->func(5); //calls G::f
p->func(5.0); // calls H::f
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

碰到这种情况,不是所有的编译器都会给个警告,有时那样做会被设置成抑制这种警告。

基于上面的两个错误

在C++11中,通过使用新关键字override可以消除这两个bugs。override明确地表示一个函数是对基类中一个虚函数的重载。更重要的是,它会检查基类虚函数和派生类中重载函数的签名不匹配问题。如果签名不匹配,编译器会发出错误信息。

我们来看看override如何消除签名不匹配bug的:

class G
{
public:
 virtual void func(int);
};
class H: G
{
public:
 virtual void func(double) override; //compilation error
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

当处理到H::func()声明时,编译器会 在一个基类查找与之匹配的虚函数。

final函数和类

C++11的关键字final有两个用途。第一,它阻止了从类继承;第二,阻止一个虚函数的重载。我们先来看看final类吧。

程序员常常在没有意识到风险的情况下坚持从std::vector派生。在C++11中,无子类类型将被声明为如下所示:

class TaskManager {/*..*/} final; 
class PrioritizedTaskManager: public TaskManager {
};  //compilation error: base class TaskManager is final
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

同样,你可以通过声明它为final来禁止一个虚函数被进一步重载。如果一个派生类试图重载一个final函数,编译器就会报错:

class A
{
pulic:
  virtual void func() const;
};
class  B: A
{
pulic:
  void func() const override final; //OK
};
class C: B
{
pulic:
 void func()const; //error, B::func is final
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

C::func()是否声明为override没关系,一旦一个虚函数被声明为final,派生类不能再重载它。

C++ 中try finally关键字详解 try-finally语句是Microsoft对C和C++语言的扩展,它能使32位的目标程序在异常出现时,有效保证一些资源能够被及时清除,这些资源的清除任务可以包括例如内存的释放,文件的关闭,文件句柄的释放等等。try-finally语句特别适合这样的情况下使用,例如一个例程(函数)中,有几个地方需要检测一个错误,并且在错误出现时,函数可能提前返回。 #include <windows> #include <stdio> try-finally语句的语法与try-except很类似,稍有不同的是,__finally后面没有一个表达式,这是因为try- finally语句的作用不是用 立即下载

相关推荐

ECC椭圆曲线加解密原理详解(配图)

椭圆曲线加解密原理详解 本文主要参照:ECC椭圆曲线详解(有具体实例)[1] 前言: 椭圆曲线(ECC)加密原理跟RSA加解密原理比起来,可真是晦涩难懂。拜读了大神Kalafinaian文章“ECC椭圆曲线详解(有具体实例)”,终于看到了参透的曙光。 由于原文中有微小的瑕疵,也为了便于阅读起来更加流畅,我重新整理了一下这篇文章。 为什么使用椭圆曲线加密算法? RSA的解决分解整数问题需要亚指数...

Mark的博客 7万+

C++ 它说 try, catch, 和 finally

在 C++ 中,`try`, `catch`, 和 `finally` 关键字通常不是标准的 C++ 语法。C++ 使用 `try` 和 `catch` 来处理异常,但没有 `finally` 块。在这个例子中,`try` 块包含可能引发异常的代码。尽管 C++ 没有 `finally` 关键字,但在资源管理方面,C++ 提供了 RAII(资源获取即初始化)的机制,允许我们使用对象的生命周期来管理资源,以确保在离开作用域时资源得到释放,类似于 `finally` 块的功能。

bluelace25的专栏 2293

EMI硬件抑制八项工程对策:从回路面积到谐振规避

电磁干扰(EMI)是电子系统可靠性与EMC合规性的核心挑战,其本质源于高频电流回路产生的辐射与耦合效应。理解回路面积、共模/差模噪声、阻抗匹配等基础原理,是实施有效抑制的前提。技术价值体现在降低辐射发射(RE)、传导发射(CE)超标风险,提升产品一次通过率与长期稳定性。典型应用场景包括开关电源设计、高速数字接口布局、工业嵌入式设备及医疗电子等对EMC要求严苛的领域。本文聚焦可落地的硬件级对策,涵盖回路面积控制、屏蔽策略、变压器漏磁管理、双线传输与阻抗匹配等关键实践,深度融合电流回路物理模型与PCB工程实现。

weixin_35019679的博客 83

C++_ C++11的override和final

使用 override 和 final 提高代码的安全性和清晰度,防止因继承结构和重写行为带来意外

学海无涯 538

基于Multisim的三相桥式全控整流电路建模、仿真与综合分析

本文基于Multisim 14.2平台,系统研究了三相桥式全控整流电路的建模与仿真方法。首先阐述了电路拓扑结构和工作原理,建立了数学模型。重点介绍了在Multisim中搭建主电路、设计六脉冲触发系统(含两种实现方案)的关键步骤,以及参数设置技巧。通过仿真分析了不同负载(阻性、阻感性)和触发角(0°-90°)下的输出特性,包括电压波形、电流谐波等性能指标。研究为电力电子教学提供了直观的仿真范例,并探讨了模型改进方向与实际工程应用价值。

huanghm88的专栏 349

疾风气象大模型4.0白皮书

《疾风气象大模型白皮书摘要》 疾风气象大模型(J-AFM)是国内首个基于3D建模的气象智能平台,突破传统二维气象分析的局限,采用体素化技术构建"x-y-z-t"四维统一模型,实现从分钟级短临到30天跨时效的连续预测。核心技术包括:1)多源数据三维同化,融合雷达、卫星、风廓线等异构数据;2)物理约束AI解码器,嵌入能量守恒、湍流封闭等气象原理;3)行业适配插件,服务风电、光伏、航空等领域,如山地风场尾流校正、云影短临预测。平台支持批流一体推理与边缘部署,提供概率化输出和误差溯源能力,显著降

专注AI大模型,软件混淆,授权 536

【4】c++11新特性(稳定性和兼容性)—>final关键字

c++中增加了final关键字来限制某个类不能被继承,或者某个虚函数不能被重写。如果使用final修饰函数,只能修饰虚函数,并且放在类或者函数的后面。在子类重写了这个方法,使用final标记后,孙子类就不能重写了。

weixin_42097108的博客 243

【华为OD机试真题 2025C卷】895、贪心歌手 | 机试真题+思路参考+代码解析 (C++、Java、Py、C语言、JS)

【华为OD机试真题 2025C卷】895、贪心歌手 | 机试真题+思路参考+代码解析 (C++、Java、Py、C语言、JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2025e卷,od机试,2025E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2025华为od,如何备战华

KJ.JK 961

c++11新特性之final 和 override关键字

目录 一. final 1 修饰函数 2 修饰类 二,override 一. final C++ 中增加了 final 关键字来限制某个类不能被继承,或者某个虚函数不能被重写。如果使用 final 修饰函数,只能修饰虚函数,并且要把final关键字放到类或者函数的后面。 1 修饰函数 如果使用 final 修饰函数,只能修饰虚函数,这样就能阻止子类重写父类的这个函数了 class Base { public: virtual void test() ...

qq_56673429的博客 856

微信H5网页支付JSAPI部分用户报错:system:access_denied 的解决方案

JSAPI 支付仅支持微信内置浏览器调用。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1681

到底什么是Harness工程?一篇文章从入门到企业落地全解析

随着OpenClaw爆火,Harness Engineering(驾驭工程)成为AI编程时代的热门概念,很多小白对其感到陌生。本文用通俗类比和真实案例,避开复杂术语,从基础定义入手,讲清Harness Engineering的核心逻辑——人类工程师设计“约束系统”(马具),让AI模型(烈马)安全高效地完成代码工作,同时拆解其核心组件、企业落地场景和实战成果,帮小白快速入门,读懂这项能解放人力、提升效率的新技术,轻松掌握它的核心价值和落地思路。

program哲学 3254

【C++】11新特性:关键字override和final

在C++11之前,一直没有***继承控制***关键字。禁用一个类的进一步衍生是可能的但也很棘手。为避免用户在派生类中重载一个虚函数,你不得不向后考虑。 ## **虚函数重载的两个常见错误** 一个派生类可以重载在基类中声明的成员函数,这是面向对象设计的基础。 然而像重载一个函数这么简单的操作也会出错。关于重载虚函数的两个常见错误如下: - 无意中重载 - 签名不匹配

qq_41950508的博客 289

69页完整版智慧港口综合解决方案

智慧港口需求4港机远程操控等自动化改造需求自动化码头AGV无线通信及专用视频系统需求安全生产视频监控类需求港机RCMS及设备管理需求岸边智能理货码头三维全景应用智慧港口解决方案5自动化码头AGV/跨运车/无人集卡无线接入港机远控视觉及冗余无线通信视觉集卡防吊起系统集装箱码头岸边智能理货港机RCMS系统无线接入港机智能化管理(无线高清视频监控、一键报警、远程抄表系统)港口拖轮无线接入岸边溢油监测系统TD-LTE覆盖及业务终端接入港口生产管理系统港口可视化集群调度港口GiNMS综合网络设备智能管理全球作业效率最

zuoan1993的博客 2128

六、C++11新特性:final和override关键字

六、final/override控制 声明:该笔记是在学习《深入理解C++11》、《C++11/14高级编程 Boost程序库探秘》时做的总结,方便以后巩固复习! 函数重载的概念: 一个类A中声明的虚函数fun在其派生类B中再次被定义,且B中的函数fun跟A中fun的原型一样(函数名、参数列表等一样),那么我们就称B重载(overload)了A的fun函数。 1、final关键字的作用 限制某个类不能被继承,或者某个虚函数不能被重写 使用 final修饰函数,只能修饰虚函数,并且要把final关键.

kevin的博客 889

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

[C++] C++11新特性之final和override关键字

final和override说明符出现在形参列表(包括任何const或者引用修饰符)以及尾置返回类型之后 override 派生类如果定义了一个函数与基类中的虚函数名字相同但是形参列表不同,这仍然是合法的行为 编译器将会认为新定义的这个函数与基类中原有的函数相互独立 派生类中的函数并没有覆盖掉基类中的函数版本 这实际上是一个错误,但是编译器并没有发现这个错误 C++11中可以使用override关键字来说明派生类中的虚函数 如果派生类中使用了override标记了某个函数,但该函数并没有覆盖基类中已存在的虚

wangmj_hdu的博客 416

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C++11新特性学习笔记—final和override关键字

一、final关键字                为什么c++现在才提供final这个关键字?很奇怪。              和Java一样,c++中的final关键字是用来修饰一个函数,防止这个函数被子类重写。                      二、override关键字         这个关键字作用蛮大的。 在C++中,有父类A,子类B,父类中有虚函数x,子类B继承

Less Is More 1914

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

c++11新特性篇-final和override关键字

上述代码中的Base类声明了虚函数test,子类中重写了该函数并声明为final,因此在孙子类中如果再次重写该函数将会报错。如果派生类中的函数使用了override关键字,但没有正确地覆盖基类中的虚函数,编译器将生成错误。当一个虚函数被声明为final时,表示该虚函数不能在派生类中被重写。主要是为了避免在继承层次中进一步的修改,增加了代码的安全性和稳定性。override关键字主要是用来确保正确书写子类中重写的虚函数。当一个类被声明为final时,它表示该类不能被其他类继承。

f593256的博客 318

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

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

码事漫谈 1160

c++多态——virtual关键字,C++11 override 和 final,析构函数的重写。

c++多态——virtual关键字,C++11 override 和 final,析构函数的重写。

zgwnb666的博客 1328

C++11 --- 关键字和语法糖

C++11中重要的新特性之 关键字和语法糖

BUG制造机的博客 1176

C++11 新增语法剖析

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

qq_61500888的博客 3406

c++ override和final关键字

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

mayue_web的博客 740

C++必知必会:final、override关键字和=default、=delete语法

final、override、=default、=delete是C++11新增的一组非常具有标记意义的关键字和语法。该关键字修饰一个类,这个类不允许被继承,这在其他语言中早就实现了。在C++11中,final关键字要写在类名的后面。示例: C++语法规定,在父类中加了virtual关键字的方法可以被子类重写,子类重写该方法时可以加或不加virtual关键字,示例: 带来的问题:为了解决这两个问题,C++引入了override关键字。 类方法被override关键字修饰,表明该方法重写了基类的同名方法,加了该

Sauron7i的博客 2113

《 C++ 点滴漫谈: 十三 》C++ 中的虚拟函数革命:virtual、override 和 final 如何改变你的代码

这篇博客深入探讨了 C++ 中 virtual、override 和 final 关键字的核心概念与使用技巧。我们从虚函数和多态的基本概念出发,讲解了如何通过 virtual 实现动态绑定,使程序能够在运行时根据对象类型调用适当的函数。接着,我们深入分析了 override 的使用,帮助开发者避免重写错误,并确保代码的正确性。同时,我们还探讨了 final 关键字,阐明了它在继承和函数重写中的重要作用。通过案例分析,我们讨论了虚函数在多继承、性能优化等方面的复杂性,并结合 C++11 及以后的增强特性,提供

Lenyiin 2490

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 final override 关键字的运用

在了解C++11中的final/override关键字之前,我们先回顾一下C++关于重载的概念。简单地说,一个类A中声明的虚函数fun在其派生类B中再次被定义,且B中的函数fun跟A中fun的原型一样(函数名、参数列表等一样),那么我们就称B重载(overload)了A的fun函数。对于任何B类型的变量,调用成员函数fun都是调用了B重载的版本。而如果同时有A的派生类C,却并没有重载A的fun函数

qwertyldd23的博客 506
上一篇: 虚表(C++)virtual table
下一篇: C++中Override
imJaron
博客等级 码龄11年 121粉丝 286原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值