当前位置:   article > 正文

c++管理虚方法之override和final_c+v中override和final

c+v中override和final

零,背景

c++中,多态的核心,就是希望通过基类访问派生类中重写(overload)的虚方法,来实现不同派生类的不同响应。但虚方法带来一些编程陷阱。如,派生类中继承了基类的虚方法,提供了不同的版本,将会出现隐藏(shadow ),覆盖旧版本。如下:

  1. class Base{
  2. public:
  3. virtual void func(char ch) const {}
  4. };
  5. class Bingo: public Base{
  6. public:
  7. virtual void func(char *ch) const {} //父子类之间,虚函数名相同,类型不同,出现隐藏
  8. };

由于类Bingo定义的func(char*ch) 而不是func(char ch),将对Bingo对象隐藏基类的func(char ch)。上述的代码在编译时不会提示错误,但是在下面程序不能使用类似于下面的代码:

  1. Bingo bin;
  2. bin.func('@'); //报错

上述的情况并不是我们想要的效果,但是编译器又不能识别这样的错误,所以c++11中添加了override,final说明符来管理虚方法。

一,override说明符

在成员函数声明或定义中,override 确保该函数为虚函数并重写(overload)某个基类中的虚函数。若此非真则程序非良构(生成编译错误)。override 是在成员函数声明符之后使用时拥有特殊含义的标识符:其他情况下它不是保留的关键词。

  1. struct A{
  2. virtual void foo();
  3. void bar();
  4. };
  5. struct B{
  6. void foo() const override; //错误,B::foo 不重写A::foo();
  7. void foo() override; //正确
  8. void bar() override; //错误 A::bar()不是虚函数
  9. };

二,final说明符

C++11的关键字final有两个用途:(1)、禁止虚函数被重写;(2)、禁止基类被继承。

在派生类中,可以同时使用overried和final。

  1. struct Base {
  2. virtual void foo();
  3. };
  4. struct A : Base {
  5. virtual void foo() final; // A::foo is final
  6. // void bar() final; // Error: non-virtual function cannot be final
  7. };
  8. struct B final : A { // struct B is final
  9. // void foo(); // Error: foo cannot be overridden as it's final in A
  10. };
  11. // struct C : B { }; // Error: B is final
  12. struct A_ {
  13. virtual void func() const;
  14. };
  15. struct B_ : A_ {
  16. void func() const override final; //OK
  17. };
  18. // struct C_ : B_ { void func()const; }; //error, B::func is final

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/950605
推荐阅读
相关标签
  

闽ICP备14008679号