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

时间:2021-05-28 09:22:29
下面的 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关键字。