override是C++11 引入的修饰符. 它最重要的2个作用:
例子
class B{public: virtual void what() = 0;};class D : public B{public: virtual void what() override { std::cout << "D::what()\n"; }};
final也是c++11引入的修饰符. 它主要也有2个作用:
例子
class B final{public: virtual void what() = 0;};class D : public B //error: cannot derive from 'final' base 'B' in derived type 'D'{public: virtual void what() override { std::cout << "D::what()\n"; }};class C{public: virtual void what() final = 0;};class F : public C // {public: virtual void what() // error: overriding final function 'virtual void C::what()'. 这里就算强制加上override, 一样会报同样的错误 { std::cout << "F::what()\n"; }};
需要指出的是, final和override均不是关键字. 仅仅只是修饰符, 意味着以下代码合法:
int main(){ int override = 0; int final = 0; return 0;}
为什么不是关键词, 突然加入一个关键字, 有可能打破后向兼容性等一系列问题. (在gcc5.7中测试, 加final, 98标准有警告这是c++11的特性, 如果继承的话, 也会报错)
final还能够让编译器优化代码. 如下:
class B{public: virtual void what() = 0;};class D : public B{public: virtual void what() final { std::cout << "D::what()\n"; } void say_what() { what(); }};
D::say_what()这里调用了what()虚函数, 这里编译器有可能就会直接翻译成D::what(), 而不会再走多态规则.
final不能修饰非虚函数.
联系客服