在 C++ 中,final 关键字有两个主要用途:一是防止类的进一步派生(即不能有子类),二是防止虚函数在派生类中被重写。下面是 final 的主要用法及相应的示例代码。
1. 防止类的进一步派生
在 C++11 及以后的版本中,final 可以用于类声明,以防止该类被继承。
class Base final {
// 类定义
};
class Derived : public Base { // 错误:Base 是 final,不能被继承
// 类定义
};
2. 防止虚函数被重写
final 也可以用于虚函数声明,以防止该函数在派生类中被重写。
class Base {
public:
virtual void show() final {
// 函数实现
}
};
class Derived : public Base {
public:
void show() override { // 错误:show() 是 final,不能被重写
// 函数实现
}
};
3. 结合 override 和 final
在实际编程中,final 常常与 override 一起使用,这样可以更清楚地表达函数重写的意图,并防止进一步重写。
class Base {
public:
virtual void show() {
// 函数实现
}
};
class Derived : public Base {
public:
void show() override final { // 重写并标记为 final
// 函数实现
}
};
class AnotherDerived : public Derived {
public:
void show() override { // 错误:Derived 中的 show() 已标记为 final
// 函数实现
}
};
总结
final 关键字是 C++11 引入的一部分,旨在提供更多的控制权,以避免类的不必要或意外的继承,以及防止虚函数的进一步重写。这些特性对于保持代码的清晰性和维护性非常有帮助,尤其是在大型和复杂的面向对象系统中。