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

C++ final和override

1. final 关键字

a. 用途

final 关键字用于两个方面:

  1. 修饰类:防止类被继承。
  2. 修饰虚函数:防止虚函数被重写(覆盖)。
b. final 修饰类

当一个类被声明为 final,它就不能被继承。也就是说,任何继承该类的尝试都会导致编译错误。

class A {
public:
    void func() {}
};

class B : public A {}  // 合法继承

class C final : public A {};  // C 类不能被继承

class D : public C {}  // 编译错误:无法继承自 'final' 类
  • 总结:当你希望一个类不被继承时,可以使用 final 来标记该类。
c. final 修饰虚函数

final 用于虚函数时,它表示该函数不能在子类中被重写(覆盖)。

class A {
public:
    virtual void func() final {
        std::cout << "A's func" << std::endl;
    }
};

class B : public A {
public:
    void func() override {  // 编译错误:无法重写 A 中的 final 函数
        std::cout << "B's func" << std::endl;
    }
};
  • 总结final 关键字用于标记虚函数,防止它在派生类中被重写。这样可以确保父类中的实现不可被更改。

2. override 关键字

a. 用途

override 用于标记子类中的虚函数,明确表示该函数是用来重写父类的虚函数的。这个关键字可以帮助编译器进行更多的检查,以确保子类中的函数确实覆盖了父类的虚函数。

b. 使用场景

当子类重写父类的虚函数时,使用 override 来明确标识。这不仅是为了可读性,还能帮助编译器检查是否真的有虚函数被重写。

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

class B : public A {
public:
    void func() override {  // 使用 override 明确表示是重写父类的虚函数
        std::cout << "B's func" << std::endl;
    }
};
c. 编译器检查

如果子类的函数没有正确重写父类的虚函数(例如,函数签名不同),编译器会给出错误提示。

class A {
public:
    virtual void func(int val) {
        std::cout << "A's func" << std::endl;
    }
};

class B : public A {
public:
    void func() override {  // 错误:函数签名不匹配,编译器会给出提示
        std::cout << "B's func" << std::endl;
    }
};
  • 总结:使用 override 关键字确保子类中的虚函数正确覆盖了父类的虚函数。如果签名不匹配或其它原因不能覆盖,编译器会报错。

3. finaloverride 配合使用

这两个关键字可以一起使用。例如,你可以在子类中声明一个虚函数为 override,并在父类中标记一个虚函数为 final,这样就禁止了子类进一步的重写。

class A {
public:
    virtual void func() final {  // 不能被重写
        std::cout << "A's func" << std::endl;
    }
};

class B : public A {
public:
    void func() override {  // 错误:父类函数是 final,不能重写
        std::cout << "B's func" << std::endl;
    }
};

总结

  • final 用来禁止继承或者禁止重写虚函数。用于类时防止继承,用于函数时防止重写。
  • override 用来明确标识子类函数是重写父类的虚函数,它能帮助编译器检查函数是否正确覆盖了父类的虚函数。

如果你在编码时使用这两个关键字,不仅可以提升代码的安全性和清晰度,还能减少潜在的错误,确保继承和重写的正确性。

相关文章:

  • 商丘做网站哪家好公司网站如何seo
  • 昆明网站做的好的公司seo 优化顾问
  • 网站开发算是研发支出吗网站搜索优化方法
  • 厦门外贸网站建设报价表项链seo关键词
  • seo优化排名推广seo自动点击排名
  • 漂亮公司网站源码打包下载seo在线推广
  • Linux上用C++和GCC开发程序实现两个不同PostgreSQL实例下单个数据库中多个Schema稳定高效的数据迁移到其它PostgreSQL实例
  • yarn application命令中各参数的详细解释
  • 物以类聚的Kmeans:数据分群的暴力美学
  • 知识库适配DeepSeek,企业微信支持自动登录,授权支持过期时间设置,zyplayer-doc 2.4.9 发布啦!
  • C语言:整数、浮点数在内存中的存储
  • AWS Glue用Python Shell从Workday系统将人力资源原始数据以Parquet格式存入S3
  • LVS+Keepalived高可用高性能负载实战
  • 【Sql Server】随机查询一条表记录,并重重温回顾下存储过程的封装和使用
  • 计算机毕业设计SpringBoot+Vue.js企业OA管理系统(源码+文档+PPT+讲解)
  • Linux《基础开发工具(上)》
  • Java中的异常处理:选择try-catch还是try-with-resources?
  • 分布式性能压测
  • FREERTOS的三种调度方式
  • 微服务架构实践:SpringCloud与Docker容器化部署
  • 从零开始用react + tailwindcss + express + mongodb实现一个聊天程序(七) 主题设置
  • 【Tomcat】
  • 基于Ubuntu2410部署LobeChat服务端数据库版本
  • 5-1JVM内存区域
  • 【记录】成为创作者的第 730 天(两年)
  • LeetCode 解题思路 7(Hot 100)