📅  最后修改于: 2023-12-03 15:29:55.296000             🧑  作者: Mango
在 C++ 中,有时定义了一个类和类中多个函数时,需要保证某些函数的特殊性质,例如构造函数必须先于其他函数调用、派生类析构函数必须先于基类析构函数调用等。这就需要特定的函数顺序,而 C++ 就提供了最终说明符(final specifier)来实现这种特殊的约束关系。
最终说明符用于确定了一个类或虚函数时,该类或虚函数是否可以被派生类覆盖以及是否可以用作最终类或最终函数。final关键字可以使用于类、虚函数和成员函数上。
如果一个类被声明为final,则它不能被继承。即不能再有类派生自该类,例如:
class FinalClass final {
...
};
此处的 FinalClass 类有最终说明符 “final”,这就表示它不能被继承。如果继承 FinalClass 类,编译器将会抛出一个错误。
如果一个虚函数被声明为final,则它不能被覆盖(override)并且不能再被子类继承实现。例如:
class A {
public:
virtual void foo() final;
};
class B : public A {
public:
void foo() override; // error: B::foo cannot override A::foo
};
函数 foo 被标记为最终函数,表示不能在子类中覆盖实现。
如果一个成员函数被声明为final,则它不能在派生类中被重载。例如:
class A {
public:
virtual void foo();
virtual void bar() final;
};
class B : public A {
public:
void foo() const; // ok
void bar() override; // error: 'void B::bar()' marked 'final', but does not override
};
函数 bar 被标记为最终函数,表示不能在子类中重载实现。
从以上示例中可以看出,final关键字的作用是在类或函数的定义或声明中使用,以指定它们的属性。
类的最终说明符仅能出现在类的定义中,不能在类的声明中出现。例如:
class A;
class B : public A {
public:
...
} final; // error: class definition cannot have a final specifier
函数的最终说明符可以在函数的声明或定义中出现:
class A {
public:
virtual void foo() final;
};
void A::foo() {} // ok
class B : public A {
public:
void foo() const; // error: B::foo cannot override A::foo
};
void B::foo() const {} // ok
从以上示例中可以看到,函数 foo 被标记为最终函数,它不能在子类中被重载,否则编译器将会抛出一个错误。此外,C++11 以前可以在类中将析构函数设为最终声明,但C++11 不支持此功能。