首页 > 编程语言 > 详细

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

时间:2020-05-25 20:16:26      阅读:59      评论:0      收藏:0      [点我收藏+]

提出问题:

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

  • 一旦一个类的成员函数被声明为虚函数,那要么被重写要么被禁止重写,永远无法覆盖。

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

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!