C++11——显式虚函数重写

提出问题:

struct Base {
    virtual void some_func();
};

struct Derived : Base {
    void some_func();             //重写
};

Derived::some_func 的真实意图??

真的重写?意外写了同名的函数?基类中加了相同的签名的虚函数?

当基类中的虚函数签名被修改,子类将无法重写该虚函数。如果子类为修改,运行期将不会正确调用该虚函数的正确的实现。

解决方案:

struct Base {
    virtual void some_func(float);
};

struct Derived : Base {
    virtual void some_func(int) override;   // 错误
    virtual void some_func(float) override; // OK
};

编译器会检查基类中的虚函数,和派生类中带有override的虚函数有没有相同的函数签名。

如果不存在,就会报错。

C++ 11也提供 final,避免类被继承或基类的函数被改写。

struct Base1 final { };

struct Derived1 : Base1 { }; // 错误

struct Base2 {
    virtual void f() final;
};

struct Derived2 : Base2 {
    void f(); //错误
};

总结:

  • 在派生类重写基类虚函数应该显示使用override,避免重写基类中不存在的虚函数,在编译期检查到错误。
  • 如果禁止重写基类虚函数,在基类虚函数明确添加final
  • 一旦一个类的成员函数被声明为虚函数,那要么被重写要么被禁止重写,永远无法覆盖。

原文链接: https://www.cnblogs.com/w1ng/p/12960477.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    C++11——显式虚函数重写

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/350694

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午6:28
下一篇 2023年3月2日 上午6:28

相关推荐