override和final

override和final

overridefinalC++11 给面向对象代码补上的两个很实用的标记。它们的价值不在运行时功能,而在于让编译器帮你提前发现继承体系里的错误

1. override 是干什么的?

override 用来明确表示:这个虚函数是用来重写基类函数的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Base
{
public:
virtual void show() const
{
}
};

class Derived : public Base
{
public:
void show() const override
{
}
};

如果函数签名写错了,编译器会直接报错。

2. 为什么 override 常用?

没有 override 时,很容易写出“以为重写了,实际上没重写”的代码:

1
2
3
4
5
6
7
8
9
10
11
class Base
{
public:
virtual void show() const {}
};

class Derived : public Base
{
public:
void show() {} // 少了 const,其实不是重写
};

这种问题很隐蔽,而 override 能让编译器立刻指出来。

3. final 是干什么的?

final 的意思是“到此为止,不允许再继续继承或重写”。

3.1 修饰类

1
2
3
class Base final
{
};

这样这个类就不能再被继承。

3.2 修饰虚函数

1
2
3
4
5
6
7
class Base
{
public:
virtual void run() final
{
}
};

这样派生类就不能继续重写 run()

4. 一个完整示例

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

class Animal
{
public:
virtual void speak() const
{
cout << "animal" << endl;
}
};

class Dog : public Animal
{
public:
void speak() const override
{
cout << "dog" << endl;
}
};

5. 使用建议

5.1 override 基本值得默认加

只要你明确是在重写父类虚函数,通常都建议加上 override

5.2 final 要有明确设计意图

final 不是越多越好,它更适合那些你明确不希望继续扩展的类或接口。

总结

overridefinal 都是很小但非常实用的语言增强。
前者帮助你避免虚函数重写错误,后者帮助你明确继承边界。对于现代 C++ 的面向对象代码来说,override 尤其值得养成习惯。