当前位置: 首页 > 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:禁止派生类重写。
  • 应用场景:增强代码的安全性、可维护性和性能。

相关文章:

  • 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框架
  • 2345网址电脑版首页/长沙关键词优化公司电话
  • 临城网站建设/培训学校管理系统
  • 普陀区网站建设前端/宁波seo网络推广定制
  • 公司网站开发制作/杭州seo优化
  • 买男装最好的购物网站/上海网络公司seo
  • 小网站建设公司/制作网站的最大公司