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