提出问题:
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大佬
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/350694
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!