C++11新特性:final和override 子类重写父类方法

下面的 final 和 override 都是写在派生类(子类)中父类声明的virtual虚函数后面。

例如:
class father
{
public:
     void test();
     virtual void print();
}

class son : public father
{
     //final关键字
     void print() final;

     //override关键字
     void print() override;
} 



final和override关键字都是写在子类虚函数后面,他们有这不同的作用:


一:final

          用来在“中途”禁止派生类重写父类的方法。

          例:有父类father和子类son和孙类grandson,继承关系是:grandson继承son,son继承father。
               需求:son类中重写print()方法,grandson不能重写print()方法。
               此时,要在son类重写父类print()后加“final”关键字来禁止grandson重写son类中的print()也就                      
               是father类中的print()               

          final关键字都是用于描述一个派生类的。那么基类中的虚函数是否可以使用final关键字呢?答案是肯定的,不过这样将使用该虚函数无法被重写,也就 失去了虚函数的意义。如果不想成员函数被重写,程序员可以直接将该成员函数定义为非虚的。而final通常只在继承关系的“中途”终止派生类的重写中有意 义。从接口派生的角度而言,final可以在派生过程中任意地阻止一个接口的可重写性,这就给面向对象的程序员带来了更大的控制力。

二:override

          用来派生类(子类)用来检查此函数是否在父类中定义为虚函数。
          例如:
          假如我再sun类假如这样的函数:
                                                       void test() override;
                                                       void printttttt() override;
                                                       void print(int a) override;
          上面的都是无法通过编译的。
          原因:一:父类中的函数test()并没有virtual关键字,没有加virtual是不允许重写的。
                    二:父类中并没有此虚函数(其实是程序员打错名字了)。
                    三:父类的print()是没有参数的。
          从上面的例子可以知道,override是用来检查父类中的virtual函数的。因为如果不加override,就算按照上面的写是不会报错的,编译器会以为那3个都是你定义在子类中的函数。记住,要重写父类的方法,一定要名字和参数列表都一致,而且父类要有virtual关键字。
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值