final用于禁止继承或重写:类定义中写在花括号前(class Base final { ... };),虚函数声明末尾加final(virtual void foo() const final;),C++11起支持,需指定标准版本。

class 后加 final 确实能禁止继承,但位置不能错
必须写在类定义的花括号前、分号后,像这样:class Base final { ... };。写成 class final Base { ... }; 是语法错误,编译器会报 error: expected class name 或类似提示。C++11 起支持,旧标准(如 C++98/03)不识别该关键字,用 clang++/g++ 编译时需加 -std=c++11 或更高版本标志。
virtual 函数后加 final 可阻止子类重写
只对虚函数有效,且必须出现在函数声明末尾(在 const、&、&& 之后,分号之前)。例如:virtual void foo() const final;。如果父类函数没声明 virtual,加 final 会直接编译失败;如果子类试图重写它,编译器报错信息通常是 error: virtual function 'foo' cannot be overridden because it is marked 'final'。
和 override 搭配用更安全,但两者语义完全不同
override 是告诉编译器“我打算重写虚函数”,用于子类;final 是告诉编译器“到此为止,不准再重写”,可用于父类或中间派生类。常见误用是把 final 当成 override 的加强版——其实它们作用域相反:一个封顶,一个确认重写。二者可共存,比如中间类用 final 封住某个函数,同时自己用 override 实现它。
注意:final 不影响对象生命周期或多态调用本身
加了 final 的类仍可正常实例化、传参、作为基类指针指向对象;虚函数加 final 后依然能被动态调用,只是子类不能再提供新实现。真正限制的是继承关系图的延展性——编译期就切断,不是运行时检查。如果你依赖模板特化或 std::is_base_of 等元编程判断继承关系,final 类会导致这些检测结果为 false,这点容易被忽略。
立即学习“C++免费学习笔记(深入)”;








