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

C++:final 关键字用于阻止类被继承或阻止虚函数被进一步重写

final 关键字的作用

C++11 引入了 final 关键字,用于阻止类被继承或阻止虚函数被进一步重写。

  • 防止类被继承:在类声明后添加 final,表示该类不能被继承。
  • 防止虚函数被重写:在虚函数声明后添加 final,表示该虚函数在派生类中不能被重写。

语法与示例

1. 防止类被继承

当类被标记为 final 时,尝试继承该类会导致编译错误。

#include <iostream>
class Base final {  // 该类无法被继承
};

// 错误:无法继承被标记为 final 的类
class Derived : public Base {
    // 编译错误:Base 是 final 类,不能被继承
};

int main() {
    Base obj;
    return 0;
}

2. 防止虚函数被重写

当虚函数被标记为 final 时,派生类中试图重写该虚函数会导致编译错误。

#include <iostream>

class Base {
public:
    virtual void display() final {  // 该虚函数不能被重写
        std::cout << "Base display" << std::endl;
    }
};

class Derived : public Base {
public:
    // 错误:无法重写被标记为 final 的虚函数
    void display() override {
        std::cout << "Derived display" << std::endl;
    }
};

int main() {
    Base b;
    b.display();  // 输出:Base display

    return 0;
}

3. 结合类与虚函数的 final 示例
#include <iostream>

class Base {
public:
    virtual void func() {
        std::cout << "Base func" << std::endl;
    }
};

class Intermediate final : public Base {  // Intermediate 类不能被继承
public:
    void func() final override {  // func 不能被进一步重写
        std::cout << "Intermediate func" << std::endl;
    }
};

// 错误:Intermediate 是 final 类,不能被继承
class Derived : public Intermediate {
    // 编译错误
};

int main() {
    Base* base = new Intermediate();
    base->func();  // 输出:Intermediate func
    delete base;

    return 0;
}

应用场景

  1. 设计安全性

    • 防止派生类或子类中误用或无意中修改关键类或函数的行为。
  2. 性能优化

    • 对于标记为 final 的类和函数,编译器可以进行更多优化,因为不需要支持动态多态。
  3. 明确意图

    • 通过显式使用 final,可以传递设计意图,告知用户该类或函数不应被修改。

注意事项

  1. finaloverride 的区别

    • override 用于确保派生类确实重写了基类的虚函数。
    • final 用于禁止派生类进一步重写虚函数。
  2. final 不影响静态函数或普通成员函数

    • 只能用于类声明和虚函数,不能用于静态成员或普通成员函数。
  3. 与抽象类的结合

    • 可以在继承体系中将某些中间类标记为 final,以限制设计的继承深度。

使用 final 可以增强代码的可维护性和安全性,是设计意图清晰表达的重要工具。


http://www.kler.cn/a/411719.html

相关文章:

  • ubuntu搭建k8s环境详细教程
  • 华为OD机试真题---智能驾驶
  • 2024年最新版Java八股文复习
  • 图论入门编程
  • 101页PDF | 德勤_XX集团信息化顶层规划设计信息化总体解决方案(限免下载)
  • 用 Python 从零开始创建神经网络(十):优化器(Optimizers)(持续更新中...)
  • Node.js笔记(三)局域网聊天室构建1
  • 在 Taro 中实现系统主题适配:亮/暗模式
  • 自动驾驶系统研发系列—智能驾驶倒车盲区终结者:智能侧向警告与制动技术解析
  • MATLAB支持的距离度量
  • 【大数据技术基础】 课程 第8章 数据仓库Hive的安装和使用 大数据基础编程、实验和案例教程(第2版)
  • uniapp定义new plus.nativeObj.View实现APP端全局弹窗
  • MDETR - Modulated Detection for End-to-End Multi-Modal Understanding
  • STM32的AFIO讲解
  • Java 爬虫深度解析销量和商品详情数据获取
  • MongoDB 和 Redis 是两种不同类型的数据库比较
  • 探索Python的HTTP之旅:揭秘Requests库的神秘面纱
  • 【leetcode】全排列 回溯法
  • 高效制作定期Excel报表:自动化与模板化的策略
  • OpenCV 计算图像清晰度
  • 2024年第15届蓝桥杯C/C++组蓝桥杯JAVA实现
  • JavaApi.JDBC( 重点 )
  • 数据结构——用数组实现栈和队列
  • 鸿蒙操作系统(HarmonyOS)
  • html select下拉多选 修改yselect.js插件实现下拉多选,搜索,限制选中,默认回显等操作
  • c#基础练习71-75