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

ops/2024/11/27 22:44:17/

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 displayreturn 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 funcdelete base;return 0;
}

应用场景

  1. 设计安全性

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

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

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

注意事项

  1. finaloverride 的区别

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

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

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

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


http://www.ppmy.cn/ops/137195.html

相关文章

QT-installEventFilter

installEventFilter 是 Qt 框架中的一个方法&#xff0c;用于在对象之间建立事件过滤机制。具体来说&#xff0c;它允许一个对象&#xff08;称为事件过滤器&#xff09;监视另一个对象&#xff08;称为被监视对象&#xff09;的事件&#xff0c;并在这些事件被处理之前对其进行…

C++ STL - vector/list讲解及迭代器失效

vector 使用 vector 是一个动态数组. 构造/拷贝构造/赋值重载函数 int main() {// 是一个模板, 在实例化的时候, 需要指明类型std::vector<int> first; // 一个空的数组std::vector<int> second (4,100); // 设置初始空间大小为 4 个int, 全部初始化为 100std::v…

大语言模型(LLM)的训练微调 Fine Tuning -- part3 本地调用

以下代码示范如何调用已经微调后的大语言模型&#xff0c;调用本地模型 先决条件 已经有了本地训练好的大语言模型&#xff0c;如何训练可以参考我的博文 《生成式 AI》课程 作业6 大语言模型&#xff08;LLM&#xff09;的训练微调 Fine Tuning -- part2-CSDN博客文章浏览阅…

Java异常类——复习1

CSDN 异常类的本质是什么&#xff1f;throwable类做了什么&#xff1f;runtimeexception有什么性质&#xff1f;其余的exception有什么性质&#xff1f;error有什么性质&#xff1f;列举几个必考的java异常子类。讲一下异常捕获的语法。

网络编程第一课

0voice第一课 https://github.com/0voice 今日学习&#xff1a;网络通信IO 网络通信的核心是通过系统提供的socket套接字实现的。socket和c语言中文件操作的本质类似&#xff0c;在c语言中&#xff0c;通过fopen、fclose、fread、fwrite实现了对文件的操作&#xff0c;socket…

详解Qt之QCache 高速缓存

文章目录 QCache 详解前言什么是 QCache&#xff1f;什么是 LRU 策略&#xff1f;QCache 的构造函数和常用成员函数构造函数1. 默认构造函数2. 指定容量的构造函数 常用成员函数1. insert2. object3. contains4. remove5. clear6. setMaxCost 完整示例代码总结 QCache 详解 前…

林业产品推荐系统:Spring Boot架构设计

3 系统分析 这部分内容虽然在开发流程中处于最开始的环节&#xff0c;但是它对接下来的设计和实现起着重要的作用&#xff0c;因为系统分析结果的好坏&#xff0c;将直接影响后面环节的开展。 3.1可行性研究 影响系统开发的因素有很多&#xff0c;比如开发成本高就不适合开展&a…

使用 PDF API 合并 PDF 文件

内容来源&#xff1a; 如何在 Mac 上合并 PDF 文件 1. 注册与认证 您可以注册一个免费的 ComPDFKit API 帐户&#xff0c;该帐户允许您在 30 天内免费无限制地处理 1,000 多个文档。 ComPDFKit API 使用 JSON Web Tokens 方法进行安全身份验证。从控制面板获取您的公钥和密钥&…