final在多态和派生中有两个妙用。
1.可以使这个类无法再被别的类继承,当你确定这个类不需要再被继承时便可以这么做。如代码所示:
class Base final
{
};
class Override:public Base
{
};
如果这样写编译器会报错并且提示 error C3246: “Override”: 无法从“Base”继承,因为它已被声明为“final”
2.多态时,当你不想让基类的虚函数被派生类的覆盖,便可以使用final关键字,使他无法被覆盖,注意一定要是虚函数!!!!!!并且必须放在最后(如const等符号后面)
如代码所示:
class Base
{
public:
virtual void f1()const final {}
};
class Override:public Base
{
public:
void f1()const;
};
报错信息为:error C3248: “Base::f1”: 声明为“final”的函数无法被“Override::f1”重写
override 关键字它主要用于防止你在继承时想要覆盖基类某个虚函数,不小心少打一点东西导致根本无法实现多态性。这个很难排查出来,因此这个override可以帮助我们分清楚是不是覆盖掉了基类的虚函数.
如代码所示:
class Base
{
public:
virtual void f1()const;
virtual void f3()const;
virtual void f4()const;
};
class Override:public Base
{
public:
void f1()const override;//正确覆盖掉了基类f1函数
void f2()override;//基类无f2,所以报错
void f3()override;//漏打const错误
void f4();//和基类f4重载并不是多态注意.
};