在C++中,关键字`final`用于指示该成员函数或类不能被派生类重新定义或继承,保证了代码的安全性。
以下是一些使用`final`需要注意的事项:
1. `final`仅适用于虚函数和类定义,对于其他成员函数,使用`final`是无效的。
2. 若类被声明为`final`,则该类不能被继承。
3. 若虚函数被声明为`final`,则该虚函数不能被派生类重写。
4. 若派生类覆盖了一个声明为`final`的虚函数,编译器会报错。
final为权限掠夺者,主要作用是:
1.掠夺函数权限:阻止函数重写
2.掠夺类的权限:阻止派生
// final关键字作用在函数上
#include <iostream>
#include <string>
using namespace std;
class Father
{
public:
Father() {
}
~Father() {
}
virtual void virtualFatherFunc();
};
class Son : public Father
{
public:
Son() {
}
~Son() {
}
// final作用在函数上,阻止子类重写这个虚函数
void virtualFatherFunc() final;
};
class GSon : public Son
{
public:
GSon() {
}
~GSon() {
}
// 父类的这个虚函数使用final终结了重写的权限,所以在这里不能重写这个继承的虚函数
// void virtualFatherFunc();
};
int main()
{
return 0;
}
// final作用在类上
#include <iostream>
#include <string>
using namespace std;
// final作用在类上阻止该类被继承
class ClassName final
{
public:
ClassName() {
}
~ClassName() {
}
private:
};
// 不能将final类型的类作为基类
// class Son : public ClassName
// {
// };
int main()
{
return 0;
}
// final作用在纯虚函数上
#include <iostream>
#include <string>
using namespace std;
class ClassName
{
public:
ClassName() {}
~ClassName() {}
// final必须加在参数列表后面
virtual void virtualFunc() final = 0;
};
class Son : public ClassName
{
};
// 纯虚函数必须重写之后才能创建对象
// 函数加上final之后阻止函数重写
// 所以不管派生多少次,派生类都不能创建对象
class GSon : public Son
{
};
int main()
{
// 因为继承了抽象类,所以永远不能继承对象,不管派生多少次
// GSon obj_gson;
return 0;
}
#include <iostream>
#include <string>
using namespace std;
class Animal
{
public:
// 函数被声明为final,因此任何子类都不能重写后覆盖该函数
virtual void eat() final{
cout << "Animals eats" << endl;
}
};
class Cat : public Animal
{
public:
// 错误, eat 函数被 Animal 类中的 final 标识符保护
// virtual void eat() {}
};
int main()
{
Animal animal;
animal.eat();
// `animal.eat()`输出`Animal eats`,表明父类函数`eat`之前被调用。
// 但是,在实例化`Cat`类后,`cat.eat()`调用到的还是`Animal`类中的`eat`函数,而不是`Cat`类中的。
Cat cat;
cat.eat();
return 0;
}
`final`关键字能够有效地帮助C++开发人员避免重写重要的方法和继承禁止的类,更严谨地保证了代码的安全性。