欢迎您访问新疆栾骏商贸有限公司,公司主营电子五金轴承产品批发业务!
全国咨询热线: 400-8878-609

新闻资讯

技术学院

C++中的final关键字用在类和方法上有什么区别?(代码示例)

作者:尼克2025-12-22 00:00:00
final在C++中用于禁止继承或重写:修饰类时置于类名后,禁止派生;修饰虚函数时置于声明末尾,禁止重写。final不可用于非虚函数,可与override共用且须在override之后。

final 在 C++ 中用于明确禁止继承或重写,但它作用在类和成员函数上时语义不同:用在类名后表示该类不可被继承;用在虚函数声明末尾表示该函数不可被派生类重写。

final 修饰类:禁止继承

在类定义的末尾加上 final,编译器会拒绝任何尝试从它派生新类的代码。

class Base final {
public:
    virtual void func() { }
};

class Derived : public Base {  // ❌ 编译错误:不能从 final 类 Base 派生
};

final 修饰虚函数:禁止重写

只能用于虚函数(包括纯虚函数)的声明末尾,表示该函数在当前类中是“最终版本”,派生类不得提供新实现。

class Base {
public:
    virtual void func() { }
    virtual void func2() final { }  // ✅ 禁止派生类重写 func2
};

class Derived : public Base {
public:
    void func() override { }        // ✅ 允许重写 func
    void func2() override { }       // ❌ 编译错误:func2 是 final 的
};

常见组合与注意点

  • final 类中的虚函数自动成为 final(无需显式写),但显式写出更清晰
  • override 和 final 可同时出现,且 final 必须写在 override 之后void f() override final
  • 非虚函数不能加 final —— 编译器报错,因为非虚函数本就不能被“多态重写”
  • final 不影响函数调用,只约束继承体系的设计意图

实际用途

提高设计安全性:防止意外继承破坏封装,或避免关键行为被误改。比如工具类、策略基类的某些核心接口,或性能敏感路径上禁止动态调度的函数。

立即学习“C++免费学习笔记(深入)”;