详解C++成员函数的override和final说明符的用法
override说明符
可使用override关键字来指定在基类中重写虚函数的成员函数。
语法
function-declarationoverride;
备注
override仅在成员函数声明之后使用时才是区分上下文的且具有特殊含义;否则,它不是保留的关键字。
使用override有助于防止您的代码中出现意外的继承行为。以下示例演示在未使用override的情况下,可能不打算使用派生类的成员函数行为。编译器不会发出此代码的任何错误。
classBaseClass { virtualvoidfuncA(); virtualvoidfuncB()const; virtualvoidfuncC(int=0); voidfuncD(); }; classDerivedClass:publicBaseClass { virtualvoidfuncA();//ok,worksasintended virtualvoidfuncB();//DerivedClass::funcB()isnon-const,soitdoesnot //overrideBaseClass::funcB()constanditisanewmemberfunction virtualvoidfuncC(double=0.0);//DerivedClass::funcC(double)hasadifferent //parametertypethanBaseClass::funcC(int),so //DerivedClass::funcC(double)isanewmemberfunction };
当使用override时,编译器会生成错误,而不会在不提示的情况下创建新的成员函数。
classBaseClass { virtualvoidfuncA(); virtualvoidfuncB()const; virtualvoidfuncC(int=0); voidfuncD(); }; classDerivedClass:publicBaseClass { virtualvoidfuncA()override;//ok virtualvoidfuncB()override;//compilererror:DerivedClass::funcB()doesnot //overrideBaseClass::funcB()const virtualvoidfuncC(double=0.0)override;//compilererror: //DerivedClass::funcC(double)doesnot //overrideBaseClass::funcC(int) voidfuncD()override;//compilererror:DerivedClass::funcD()doesnot //overridethenon-virtualBaseClass::funcD() };
若要指定不能重写函数且不能继承类,请使用final关键字。
final说明符
可以使用final关键字指定无法在派生类中重写的虚函数。您还可以使用它指定无法继承的类。
语法
function-declarationfinal; classclass-namefinalbase-classes
备注
final只有在函数声明或类名称后使用时才是区分上下文的且具有特殊含义;否则,它不是保留的关键字。
在类声明中使用final时,base-classes是声明的可选部分。
下面的示例使用final关键字指定无法重写虚函数。
classBaseClass { virtualvoidfunc()final; }; classDerivedClass:publicBaseClass { virtualvoidfunc();//compilererror:attemptingto //overrideafinalfunction };
有关如何指定可以重写成员函数的信息,请参阅override说明符"。
下一个示例使用final关键字指定无法继承类。
classBaseClassfinal { }; classDerivedClass:publicBaseClass//compilererror:BaseClassis //markedasnon-inheritable { };