新闻中心
C++如何使用final和override_C++11中控制虚函数重写的关键字
override用于确保派生类函数正确重写基类虚函数,防止签名不匹配;2. final可阻止类被继承或虚函数被重写;3. 二者结合使用能明确设计意图并提升安全性与可维护性。

在C++11中,final和override是两个用于控制虚函数重写的关键字。它们帮助开发者更清晰地表达设计意图,并让编译器在编译期发现常见的错误,比如拼错函数名、参数类型不匹配或试图重写一个不该被重写的虚函数。
使用 override 确保正确重写虚函数
override关键字用于派生类的成员函数声明中,表示该函数意在重写基类中的虚函数。如果实际没有匹配到任何基类的虚函数,编译器会报错。
这能有效防止因函数签名不一致导致的“意外隐藏”而非重写的问题。
- 必须出现在函数声明的末尾,在const、引用限定符和 noexcept 之后
- 只能用于虚函数的重写(即在派生类中)
- 提高代码可读性,明确表明设计意图
示例:
CA.LA
第一款时尚产品在线设计平台,服装设计系统
94
查看详情
class Base {
public:
virtual void foo(int x) const;
virtual ~Base() = default;
};
class Derived : public Base {
public:
void foo(int x) const override; // 正确:成功重写
// void foo(double x) const override; // 编译错误:没有匹配的基类函数
};
使用 final 防止类被继承或虚函数被进一步重写
final关键字有两个用途:修饰类时,表示该类不能被继承;修饰虚函数时,表示该函数在派生类中不能再被重写。
- 放在类名后,表示类不可继承
- 放在虚函数声明末尾,表示函数不可再被重写
- 有助于性能优化(编译器可能进行内联等优化)
示例:
class FinalClass final {
// 这个类无法被继承
};
// class DerivedFromFinal : public FinalClass { }; // 编译错误
class Base {
public:
virtual void bar() final; // 不允许在派生类中重写
virtual ~Base() = default;
};
class Derived :
public Base {
// void bar() override; // 编译错误:bar 是 final 的
};
结合使用 override 和 final
可以在同一个函数上同时使用 final 和 override,表示这个函数重写了基类的虚函数,并且不允许其子类继续重写。
这种用法适用于希望在某一层级终止多态链的情况。
示例:
class Base {
public:
virtual void func();
};
class Middle : public Base {
public:
void func() override final; // 重写并禁止进一步重写
};
class Last : public Middle {
// void func() override; // 错误:func 已经是 final 的
};
基本上就这些。合理使用 override 和 final 能提升代码的安全性和可维护性,建议在所有明确要重写的函数上加上 override,对不希望被扩展的部分使用 final。不复杂但容易忽略。
以上就是C++如何使用final和override_C++11中控制虚函数重写的关键字的详细内容,更多请关注其它相关文章!
# 派生类
# 阿拉尔网站建设报价
# 营销推广活动媒介
# 脱发产品推广营销
# 界首网站的建设
# 有哪些网站建设指标
# 蚌埠seo推广价格多少
# 邢台什么是网站建设商家
# 湘潭网站建设信息网
# 网站优化方向怎么发展
# 陈列与展示网站建设
# 解决方法
# c++
# 多态
# 怎么做
# 类中
# 放在
# 如何使用
# 有什么
# 子类
# 重写
# 代码可读性
# 编译错误
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
sublime侧边栏怎么增强功能_SideBarEnhancements for sublime安装与配置
C++如何比较两个字符串_C++ string compare函数与操作符对比
顺丰快递查单号物流信息 顺丰快递小程序查询入口
魅族20怎样在浏览器开无图省流_iPhone魅族20浏览器开无图省流【流量节省】
12306选座怎么选到特殊座位_12306特殊座位选择注意事项
理解Python模块与全局变量的作用域管理
我的世界mc.js免费游戏直接能玩 我的世界mc.js小游戏免费秒玩入口
Golang如何处理RPC请求负载均衡_Golang RPC请求负载均衡策略与实践
Composer如何处理Git子模块(submodule)依赖_Composer与Git Submodule的对比与选择
QQ邮箱登录官网首页 腾讯QQ邮箱网页入口
Google翻译怎么语音输入_Google翻译语音输入功能使用与设置方法
Go调试环境为何无法启动_Go调试器启动失败原因与解决策略
深入理解Promise链:如何在catch后中断then的执行
Win11输入法不见了怎么办_Windows11恢复语言栏显示方法
修复二维数组索引越界异常:一维循环到二维坐标的正确映射
如何修改开机登录密码_Windows账户安全设置超详细教程【必学】
win11如何卸载Windows更新补丁 Win11解决更新导致系统不稳定的问题【修复】
如何为你的Composer包编写自动化测试_集成PHPUnit到Composer的scripts工作流
MAC的“快捷指令”怎么同步到iPhone_MAC利用iCloud同步所有设备的自动化指令
Composer的 "check-platform-reqs" 命令有什么用_在部署前检查生产环境是否满足Composer依赖需求
如何优雅地解决Livewire文件上传难题?SpatieLivewireFilepond让一切变得简单
使用Python高效删除Word宏并转换DOCM为DOCX格式
c++如何实现一个简单的ECS框架_c++数据驱动设计与游戏开发
台积电1.4nm工艺A14瞄准2028:10年来性能提升80%
C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图
Python字典中优雅地迭代剩余元素的方法
支付宝如何管理隐私设置_支付宝隐私保护的配置技巧
必由学官网首页入口 必由学教师网页版登录指南
快速CSGO开箱网站指南 CSGO开箱平台推荐
AO3官网镜像链接 Archive of Our Own同人文在线浏览
Log4j Console Appender性能瓶颈与高并发优化策略
Win11 USB传输速度慢怎么解决 Win11 USB驱动更新与设置
优化MinIO list_objects_v2 操作的性能瓶颈与最佳实践
文本文档写html代码怎么运行_文本文档html代码运行步骤【教程】
poki免费入口快捷访问 poki人气小游戏直接玩站点
如何使用Node.js csv 包按条件移除含空字段的CSV记录
UC浏览器如何安装插件 UC浏览器添加扩展程序详细教程【进阶】
深入理解J*aScript中的B样条曲线与节点向量生成
今日头条怎么同步内容到抖音_今日头条内容同步到抖音教程
Lar*el 递归关系中排除指定分支的教程
QQ邮箱官方登录入口_QQ邮箱网页版快捷使用平台
Win11如何使用Windows Sandbox Win11沙盒功能开启与使用教程【详解】
哔哩哔哩忘记密码了怎么找回_哔哩哔哩密码找回方法
如何将一个大型PHP应用拆分为多个Composer包_微服务与模块化架构的Composer实践
在J*a中如何隐藏复杂性_使用门面模式组织对象交互
Yandex官网免登录入口_俄罗斯Yandex搜索引擎一键访问
Discord Slash 命令响应超时问题的异步解决方案
淘宝网网页版登录入口 淘宝官方网页版快捷登录
J*aScript 字符串标签转换:使用正则表达式高效替换
Golang如何优雅处理error_Golang error处理最佳实践总结


2025-11-21
浏览次数:次
返回列表
public Base {
// void bar() override; // 编译错误:bar 是 final 的
};