- final
有时我们会定义这样一种类,我们不希望其他类继承它,或者不想考虑它是否适合作为一个基类。为了实现这一目的,c++ 11新标准提供了一种防止继承发生的方法,即在类名后跟一个关键字final:
class base final {/* */} //base不能作为基类 class Derived:base { /* */} //错误,base不能作为基类
此外,final还可以修饰类中的虚函数,表示类成员函数不可以在派生类中进行覆盖
class base { virtual void fun() final {...}; } class derived:base { void fun(){...}; //error, }
override
对于基类中的虚函数,派生类可以选择覆盖或者不覆盖。选择覆盖时,则派生类中该函数的形参和返回值类型必须与基类严格匹配。若选择不覆盖,则可以存在与基类中虚函数同名的函数,但通常为了避免歧义,不会选择使用同名函数。为了加以区分,对于选择覆盖的函数用override加以修饰,表示该函数覆盖了基类的虚函数,若没有覆盖,则报错。
class base { public: virtual void f1(); virtual void f2(); void f3(); } class derived:public base { public: void f1()override; //ok void f2(int) override; //error,基类中不存在f2(int)虚函数 void f3() override; //error,f3不是虚函数 }
注:final,override修饰的函数必须为虚函数