1、final用于让虚函数不可被重写
struct B2 { virtual void f() final {} // final 函数 }; struct D2 : B2 { virtual void f() {} };
如上代码是不可被编译过的
2、override
1.在函数比较多的情况下可以提示读者某个函数重写了基类虚函数(表示这个虚函数是从基类继承,不是派生类自己定义的);
2.强制编译器检查某个函数是否重写基类虚函数,如果没有则报错。
如:
强制检查这个类的父类里是否有这个handleEvent的虚函数,参数、返回值必须全部一致,如果没有则编译不过 。
在实际使用过程中,更多的是帮助程序员验证纯虚函数是否拼写正确,包括检查函数名、参数类型、参数个数、返回值等,如下场景:
A程序员定义了一个接口类,有一个接口函数
virtual void exec(int,string)=0;
B程序员需要实现这个接口,就在自己的子类中声明
void exec(int,int) override;
这句话是不能通过编译的,因为标记上了override,这告诉编译器此函数是重写父类的一个函数:void exec(int,int)
但是显而易见,父类中没有一个这样的函数,聪明的编译器直接报错。某些编辑器,如QtCreator在编写代码的时候就直接报错了。