0

0

c++中如何使用final和override关键字_final与override关键字使用详解

冰火之心

冰火之心

发布时间:2025-09-22 14:29:01

|

934人浏览过

|

来源于php中文网

原创

c++中如何使用final和override关键字_final与override关键字使用详解

在C++中,finaloverride是两个用于控制类继承和虚函数重写的特殊标识符。它们从C++11开始引入,帮助开发者编写更安全、更清晰的面向对象代码。虽然它们不是强制使用的,但合理使用能有效避免常见的继承错误。

override关键字:确保正确重写虚函数

override的作用是显式表明某个成员函数意在重写基类中的虚函数。如果该函数实际上没有重写任何基类虚函数(比如函数名拼错、参数不匹配或基类函数非虚),编译器会报错。

使用override可以防止因签名不一致导致的“意外隐藏”而非“重写”的问题。

示例:
class Base {
public:
    virtual void func(int x) { }
    virtual void funcNoOverride() { }
};

class Derived : public Base {
public:
    void func(int x) override { }        // 正确:成功重写
    // void func(double x) override { }  // 错误:没有匹配的基类虚函数
    void funcNoOverride() final;         // 可以结合使用
};

如果没有写override,即使函数签名不匹配,Derived::func(double)也会被视为新函数,从而隐藏基类版本,容易引发逻辑错误。加上override后,这类错误会在编译期被发现。

立即学习C++免费学习笔记(深入)”;

final关键字:阻止进一步继承或重写

final可用于类或虚函数,表示“不可再被继承”或“不可再被重写”。

当用于类时,表示该类不能作为基类被继承:

Runway Green Screen
Runway Green Screen

Runway 平台的AI视频工具,绿幕抠除、视频生成、动态捕捉等

下载
class FinalClass final {
    // ...
};

// class SubClass : public FinalClass { }; // 编译错误:不能继承final类

当用于虚函数时,表示派生类不能再重写这个函数:

class Base {
public:
    virtual void foo() const;
    virtual void bar() final; // 不允许在派生类中重写
};

class Derived : public Base {
public:
    void foo() const override;     // 合法
    // void bar() override;        // 错误:bar是final,不能重写
};

也可以在定义Derived类时使用final标记整个类:

class MostDerived final : public Derived {
    // ...
};

// class Last : public MostDerived { }; // 错误:MostDerived是final

结合使用override与final

在一个虚函数上可以同时使用overridefinal,表示该函数重写了基类虚函数,并且不允许其子类继续重写。

class Base {
public:
    virtual void doWork() { }
};

class Derived : public Base {
public:
    void doWork() override final { } // 重写并禁止进一步重写
};

class FinalDerived : public Derived {
public:
    // void doWork() override { }   // 错误:doWork在Derived中是final
};

这种组合在设计稳定接口时非常有用,例如框架中某些核心行为只允许特定层级定制,之后不再开放修改。

注意事项与最佳实践

  • 尽量对所有意图重写的虚函数使用override,提高代码可读性和安全性。
  • 在确定某个类或虚函数不应再扩展时使用final,有助于优化(编译器可能进行内联等处理)。
  • final不是访问控制,而是语义限制;它不影响public/protected/private属性。
  • override只能用于虚函数的重写,不能用于新增函数或非虚函数。

基本上就这些。合理使用final和override,能让继承体系更健壮,减少运行时多态带来的隐性bug。它们虽小,但在大型项目中作用显著。

相关专题

更多
go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

56

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

49

2025.11.27

java多态详细介绍
java多态详细介绍

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

15

2025.11.27

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

180

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

279

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

253

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

121

2025.08.07

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

52

2025.08.29

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

27

2026.01.16

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 6.9万人学习

C 教程
C 教程

共75课时 | 4.1万人学习

C++教程
C++教程

共115课时 | 12.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号