
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
1.7.3 工作原理
override关键字的用法很简单:在虚函数的声明或定义中,它可以保证函数确实覆盖了一个基类函数,否则,编译器会报错。
注意,override和final关键字都是特殊标识符,仅在成员函数声明或定义中有意义。它们不是保留关键字,所以仍然可以在代码的其他任何地方用作自定义标识符[5][6]。
使用override标识符有助于编译器检查虚方法是否覆盖另一个虚方法,如以下示例所示:

如果不存在override标识符,则Derived1类的虚方法bar(char const)将不是覆盖方法,而是来自Base的bar()的重载。
另一个特殊标识符final用在成员函数声明或定义中,表示该函数是虚函数并且不能在派生类中被覆盖。如果派生类试图覆盖该虚函数,编译器会报错:

final标识符也可以在类的声明中使用,表示该类不能被继承:

由于override和final在定义中使用时都具有特殊含义,并且实际上不是系统保留关键字,因此你仍然可以在C++代码中的其他任何地方使用它们。这可以确保用C++11之前的版本编写的现有代码不会因使用它们作为标识符而损坏:

尽管前面我建议在重写虚方法的声明中同时使用virtual和override,但是virtual关键字是可选的,可以省略以缩短声明。override标识符的存在应该足以表明该方法是虚方法,这是个人喜好问题,并不影响语义。