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;
}
应用场景
-
设计安全性:
- 防止派生类或子类中误用或无意中修改关键类或函数的行为。
-
性能优化:
- 对于标记为
final
的类和函数,编译器可以进行更多优化,因为不需要支持动态多态。
- 对于标记为
-
明确意图:
- 通过显式使用
final
,可以传递设计意图,告知用户该类或函数不应被修改。
- 通过显式使用
注意事项
-
final
与override
的区别:override
用于确保派生类确实重写了基类的虚函数。final
用于禁止派生类进一步重写虚函数。
-
final
不影响静态函数或普通成员函数:- 只能用于类声明和虚函数,不能用于静态成员或普通成员函数。
-
与抽象类的结合:
- 可以在继承体系中将某些中间类标记为
final
,以限制设计的继承深度。
- 可以在继承体系中将某些中间类标记为
使用 final
可以增强代码的可维护性和安全性,是设计意图清晰表达的重要工具。