目前用的比较多的是override,主要是在派生类中重写基类虚函数时。有助于加强代码可读性和减少一些拼写错误。
1.final
final限定某个类不能被继承或某个虚函数不能被重写。如果修饰函数只能修饰虚函数,且要话到类或函数后面。参考如下:
struct A
{
virtual void fun() final; //该虚函数不能被重写
virtual bar() final; //err: 非虚函数不能被final修饰
};
struct B final : A
{
void fun(); //err: 该虚函数不能被重写,因为在A中已经被声明为final
};
struct C : B //err: B是final
{
};
2.override
override关键字保证了派生类中声明重写的函数与基类虚函数有相同的签名,可避免一些拼写错误,如加了此关键字但基类中并不存在相同的函数就会报错,也可以防止把本来想重写的虚函数声明成了重载。同时在阅读代码时如果看到函数声明后加了此关键字就能立马知道此函数是重写了基类虚函数。保证重写虚函数的正确性的同时也提高了代码可读性。
struct A
{
virtual void fun();
};
struct D : A
{
void fun() override;//显示重写
};