final 与 override关键字

final 与 override关键字

final关键字

指定某个虚函数不能在派生类中被覆盖,或者指定某个类不能被派,主要作用在于防止虚函数无意的重写。

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
using namespace std;

struct Base
{
virtual void foo();
};

struct A : Base
{
void foo() final; // Base::foo 被覆盖而 A::foo 是最终覆盖函数
void bar() final; // 错误: bar 不是虚函数,因此它不能是 final 的
};

struct B final : A // struct B 为 final
{
void foo() override; // 错误:foo 不能被覆盖,因为它在 A 中是 final 的
};

struct C : B // 错误:B 是 final 的
{
};

int main(){
cout<<"final test"<<endl;
return 0;
}

编译结果

image-20220508211103290

override关键字

指定一个虚函数覆盖另一个虚函数。保证在派生类中声明的重载函数与基类中的虚函数有相同的签名,防止重写基类虚函数时意外创建了一个新的虚函数。

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;

struct A
{
virtual void foo();
void bar();
};

struct B : A
{
void foo() const override; // 错误:B::foo 不覆盖 A::foo(签名不匹配)
void foo(int i) override;// 错误:B::foo 不覆盖 A::foo(签名不匹配)
void foo() override; // OK:B::foo 覆盖 A::foo
void bar() override; // 错误:A::bar 不是虚函数
};

int main()
{
cout<<"override test"<<endl;
return 0;
}

编译

image-20220508211935557

#
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×