1.override关键字
- 作用
显式标记派生类中的函数是覆盖基类的虚函数。编译器会检查签名是否与基类虚函数一直,避免因签名不一致导致意外行为。
- 使用场景
- 在派生类中重写基类虚函数时,显式声明覆盖关系。
- 防止因函数名拼写错误、参数类型不匹配或者常两性(
const)不一致导致的错误覆盖。
- 语法规则
- 只能用于虚函数(基类必须有对应的
virtual声明)。
- 必须放在函数声明的末尾(在
const或引用限定符之后)。
- 示例
#include <iostream>
using namespace std;
class Base {
public:
virtual void foo(int);
virtual void bar() const;
};
class Derived : public Base {
public:
void foo(int) override; //正确:覆盖Base::foo(int)
void foo(double) override; //错误:基类无virtual void foo(double)
void far() override; //错误:常两性不匹配(基类的bar()是const)
};
- 好处
- 编译时检查:确保派生类函数正确覆盖基类虚函数。
- 代码清晰:明确表达设计意图,便于维护。
2. final关键字
- 作用
- 标记类:禁止该类被继承。
- 标记虚函数:禁止该虚函数在派生类中被进一步覆盖。
- 使用场景
- 设计不可扩展的类(如工具类、库的核心类)。
- 终止虚函数的覆盖脸(确保某个实现在派生类中不再被修改)
- 语法规则
- 用于类:
class ClassName final { ... };
- 用于虚函数:
virtual void func() final;
- 实例
/* 1.禁止类被继承 */
class Base final { /*...*/ };
class Derived : public Base { //错误: Base是final类,无法继承
/* ... */
};
/* 2.禁止虚函数被重写 */
class Base {
public:
virtual void foo() final; //声明final
};
class Derived : public Base {
public:
void foo(); // 错误:Base::foo()是final,不可覆盖
};