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,可以更好地控制类的继承层次和虚函数的行为,使代码更加健壮和易于维护。
如有错误,敬请指正!!!