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