C++禁止类被继承或函数被重写 _ final关键字用法【干货】

风杰酱_1106

风杰酱_1106

2026-04-11

324人浏览

原创

final是c++11起唯一标准、零成本、编译期强制的禁止手段;类名后加final禁止继承,虚函数声明末尾加final禁止重写,仅适用于类定义和虚函数声明,用错位置或对象即报错。

c++禁止类被继承或函数被重写 _ final关键字用法【干货】

直接说结论:用 final 是 C++11 起唯一标准、零成本、编译期强制的禁止手段;加错位置、用在非虚函数上、或混用 virtual 修饰类,都会立刻报错。

class 名后加 final:禁止继承的硬性写法

必须紧贴类名之后,不能插在访问说明符或基类列表中间。写成 class Base final { ... }; 合法;class Base { ... } final; 或 public final class Base 都非法。

  • 错误现象:error: cannot derive from 'final' base class 'Base' —— 这不是警告,是编译失败,连目标文件都出不来
  • 模板类也能用:template<typename t> class Holder final { ... };</typename>,但检查发生在实例化时(比如 Holder<int></int> 被继承才报错)
  • 和 private 构造函数、= delete 拷贝构造完全不是一回事:前者只拦继承语句本身,后者拦对象创建,且都可能被 friend 或静态工厂绕过
  • 一旦加了 final,所有下游依赖必须重编译;想取消限制?得改头文件、全量 rebuild,ABI 层面已锁定

虚函数声明末尾加 final:只封重写,不封继承

final 只能用于虚函数(含纯虚函数),且必须出现在声明末尾,也就是参数列表、const/noexcept 之后。例如:virtual void process() const final;

C++ Code Review Master
C++ Code Review Master

组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。

下载
  • 常见误写:virtual void f() final {}(定义体里写 final)→ 语法错误;void f() final;(没 virtual 且父类也没声明为虚)→ 编译拒绝
  • 可与 override 共存:void func() override final; 合法,顺序无关,但 final 必须在最右
  • 子类即使不写 override,只要签名匹配就触发错误:void func(); 也会被当成试图重写而拒编
  • 性能提示:标记 final 后,编译器可能省掉虚表查表,甚至内联该调用 —— 但这不是 guaranteed,取决于具体实现和优化级别

哪些地方绝对不能用 final

final 不是万能胶,它只在两个明确上下文生效:类定义后、虚函数声明末尾。其他任何位置加,都是无效或非法的。

  • 非虚成员函数加 final → 编译错误:error: 'final' may only be specified for virtual member functions
  • 构造函数、析构函数(除非是虚析构)、静态成员函数、友元函数、普通命名空间函数 —— 全都不支持
  • 类模板特化里单独加 final(比如头文件中类没 final,某个 .cpp 里又写一遍加 final)→ ODR 违规,未定义行为
  • 和 virtual 同时修饰类:virtual class X final → 语法错误;final 本身已隐含“不可派生”,再加 virtual 矛盾

真正容易被忽略的是:你在中间层类(比如 ServiceLayer)加了 final,但下游 SDK 或插件模块正依赖继承它来扩展逻辑 —— 错误不会在你本地构建时报出,而是在别人集成时炸开。所以 final 不是“以防万一”,而是“我确认这是终端类型”,比如 std::string_view、std::optional 这类值语义工具类才适合。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

929

5

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.25

2620

5

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2023.09.20

2058

7

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.23

636

5

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

2025.11.27

351

13

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

2024.01.03

3516

7

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

2025.12.06

286

9

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

2023.11.13

2691

4

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.12.29

825

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习