当前位置: 首页 > news >正文

C++11 中引入的`final` 关键字作用。

在C++中,final 是一个关键字,用于限制类、虚函数或者继承行为。它主要用于增强代码的可读性和安全性,避免某些潜在的错误。以下是 final 关键字的详细用法及其适用场景:


1. 用于类

当一个类被声明为 final 时,表示该类不能被其他类继承。这可以防止派生类的出现,从而减少复杂性并提高代码的安全性。

示例:
class Base final {
public:void display() {std::cout << "This is the base class." << std::endl;}
};// 尝试继承一个被标记为 final 的类会导致编译错误
// class Derived : public Base { }; // 错误:Base 类是 final 的
应用场景:
  • 防止多重继承冲突:通过禁止继承,可以避免复杂的继承层次。
  • 提升性能:编译器可以对 final 类进行更多优化。

2. 用于虚函数

当一个虚函数被声明为 final 时,表示该虚函数不能在派生类中被重写(override)。这可以避免子类意外地覆盖父类的行为。

示例:
class Base {
public:virtual void show() final {std::cout << "Base class function." << std::endl;}
};class Derived : public Base {
public:// 尝试重写 show 函数会导致编译错误// void show() override { } // 错误:show() 被声明为 final
};
应用场景:
  • 明确意图:通过 final 标记虚函数,表明开发者不希望其行为被修改。
  • 减少错误:防止子类意外覆盖基类的关键功能。

3. 用于方法的 override 行为

当一个虚函数被声明为 final 后,任何试图从派生类中重写它的尝试都会导致编译错误。这与直接在派生类中使用 overridefinal 的组合效果一致。

示例:
class Base {
public:virtual void process() final {std::cout << "Base class implementation." << std::endl;}
};class Derived : public Base {
public:// 尝试重写 process 函数会导致编译错误// void process() override { } // 错误:process() 被声明为 final
};

4. 与其他特性结合使用

final 可以与 virtualoverride 结合使用,进一步增强代码的语义清晰度。

示例:
class Base {
public:virtual void action() final {std::cout << "Base class action." << std::endl;}
};class Derived : public Base {
public:// 尝试重写 action 函数会导致编译错误// void action() override final { } // 错误:action() 被声明为 final
};

5. 历史背景

final 关键字是在 C++11 中引入的,旨在提供更细粒度的控制能力。在早期的 C++ 中,虚函数的行为完全依赖于派生类的实现,缺乏显式的语义约束。


总结

  • final:禁止继承。
  • 虚函数 final:禁止派生类重写。
  • 应用场景:增强代码的安全性、可维护性和性能。
http://www.dtcms.com/a/216362.html

相关文章:

  • python处理signal(信号)
  • 8种使用克劳德4的方法,目前可用随时更新!
  • Map集合(双列集合)
  • Qt QPaintEvent绘图事件painter使用指南
  • lcd-framebuffer驱动开发参考文章
  • 外卖霸王餐支持京东外卖点餐啦~
  • 零基础远程连接课题组Linux服务器,安装anaconda,配置python环境(换源),在服务器上运行python代码【1/3 适合小白,步骤详细!!!】
  • 高防CDN如何解决网站访问卡顿与崩溃问题?
  • 如何提高CAD作图设计效率,技术分享
  • Memory Repair (一)
  • 【报错解决方案】cannot open shared object file: No such file or directory
  • Unity3D仿星露谷物语开发54之退出菜单及创建可执行文件
  • 非标RFID电子标签工业载码体如何定制?
  • win11如何重启
  • OpenCV---findCountours
  • 11.13 LangGraph记忆机制解析:构建生产级AI Agent的关键技术
  • Linux的五种IO模型
  • 《软件工程》实战— 在线教育平台开发
  • 2.1 Maven项目架构管理工具
  • Pathway:重新定义实时数据处理的Python框架
  • PHP实战:安全实现文件上传功能教程
  • SQL进阶之旅 Day 5: 常用函数与表达式
  • K8s边缘集群赋能工业自动化:从传感器监控到智能决策的全流程升级
  • 跨协议协同智造新实践:DeviceNet-EtherCAT网关驱动汽车焊接装配效能跃迁
  • UE5 蓝图,隐藏一个Actor,同时隐藏它的所有子物体
  • OpenCV CUDA模块图像处理------颜色空间处理之GPU 上交换图像的通道顺序函数swapChannels()
  • 【STM32】HAL库 之 CAN 开发指南
  • JS高级 - 对象
  • 十一、Samba文件共享服务
  • 2025年- H55-Lc163--124. 二叉树的最大路径和(深搜)--Java版