打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
c++11 specifier: override or final

override specifier

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 specifier

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";    }};

Interesting points

需要指出的是, 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不能修饰非虚函数.

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C++中的虚函数(virtual function)
谈谈C 继承中的重载,覆盖和隐藏 转 Kendiv的专栏
C 中的虚函数(virtual function)
重载 覆盖 隐藏
C++多态
含有虚函数的类sizeof大小
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服