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

C++11新特性之final

1.介绍

        final是C++11引入的特性,用于限制类或虚函数的进一步继承或重写,旨在增强代码的安全性和可维护性。经常与override一起使用。不了解override的读者可以看这里———>C++11新特性之override-CSDN博客

2.final的用法

        (1)禁止类被继承

        将final关键字放在类名后边,可以禁止其他类继承该类。例如:

class Base final { // Base 类不能被继承
public:
    void func() {
        std::cout << "Base::func()" << std::endl;
    }
};

// class Derived : public Base {}; // 错误:Base 是 final 类,不能继承

int main() {
    Base baseObj;
    baseObj.func(); // 输出: Base::func()
    return 0;
}

        (2)禁止虚函数被重写

        将final关键字放在虚函数声明后面,可以进制派生类重写该函数。例如:

class Base {
public:
    virtual void func() final { // 禁止派生类重写 func
        std::cout << "Base::func()" << std::endl;
    }
};

class Derived : public Base {
public:
    // void func() override {} // 错误:Base::func() 是 final,不能重写
};

int main() {
    Derived derivedObj;
    derivedObj.func(); // 输出: Base::func()
    return 0;
}

        (3)override与final结合使用

        final与override一起使用,以明确表明函数是重写的,但禁止进一步的重写。例如:

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

class Derived : public Base {
public:
    void func() override final { // 重写并禁止进一步重写
        std::cout << "Derived::func()" << std::endl;
    }
};

class FurtherDerived : public Derived {
public:
    // void func() override {} // 错误:Derived::func() 是 final,不能重写
};

int main() {
    FurtherDerived obj;
    obj.func(); // 输出: Derived::func()
    return 0;
}

3.final的使用场景

        (1)设计不可扩展的类。一个类设计完整,不需要被继承,可以用final。

        (2)保护关键虚函数。当某个虚函数实现已经固定,不希望派生类修改时,可以使用final。

        (3)优化性能:标记为final的类或虚函数可以帮助编译器进行优化,因为编译器知道它们不会被进一步拓展或重写了。

4.总结        

  • final用于禁止类被继承或虚函数被重写。

  • 它可以增强代码的安全性和可维护性,防止意外的继承或重写。

  • 结合 override 使用,可以更清晰地表达设计意图。

  • 适用于设计不可扩展的类或保护关键虚函数的场景。

合理使用final,可以更好地控制类的继承层次和虚函数的行为,使代码更加健壮和易于维护。

如有错误,敬请指正!!!

相关文章:

  • 【Erdas实验教程】007:图像融合(多波段+高光谱)
  • 介绍 Liquibase、Flyway、Talend 和 Apache NiFi:选择适合的工具
  • 故地重游:一眼是曾经,一眼是如今
  • 前端高级面试题
  • cmake Qt Mingw windows构建
  • mount 出现 2038 问题
  • Spring AI集成DeepSeek,实现流式输出
  • 如何使用border-image做大屏公共组件的边框
  • ICLR2022 | SETR | 提高视觉Transformers的对抗迁移性
  • 传统混合专家模型MoE架构详解以及python示例(DeepSeek-V3之基础)
  • VUE3环境搭建
  • ARINC 429详解
  • CentOS 7 企业级Redis 7部署指南
  • Python入门之List(列表)
  • CPU的原理
  • Cherno C++ P54 内存:栈与堆
  • 深度学习04 数据增强、调整学习率
  • 数据结构 红黑树和set/map
  • Windows环境搭建ES集群
  • DeepSeek-R1 大模型本地部署指南
  • 中国驻美国使领馆提醒在美中国公民注意交通安全
  • 多地晒五一假期前两日成绩单,湖南单日客流同比增长逾三成
  • 全国铁路旅客发送量连续3天同比增幅超10%,今日预计发送1800万人次
  • 魔都眼|石库门里看车展,五一来张园体验城市“漫时光”
  • 美国季度GDP时隔三年再现负增长,特朗普政府关税政策对美国经济负面影响或将持续
  • 乌方公布矿产协议详情:未提债务义务,包含美再援助条款