虚函数的override和final指示符
派生类如果定义了一个函数与基类中虚函数的名字相同但是形参列表不同,这仍然是合法的行为。编译器将认为新定义的这个函数与基类中原有的函数是相互独立的,这时派生类的函数并没有覆盖掉基类中的版本。但这种声明往往意味着发生了错误,因为我们原本可能希望派生类能覆盖掉基类中的虚函数,但是不小心把形参列表弄错了。
我们可以在派生类的虚函数使用override关键字,显式表明我希望覆盖基类中的虚函数版本。
struct B {
virtual void f1(int) const;
virtual void f2();
void f3();
};
struct D :B {
void f1(int) const override; //正确:f1与基类中的f1匹配
void f2(int) override; //错误:B没有形如f2(int)的函数
void f3() override; //错误:f3不是虚函数
void f4() override; //错误:B没有名为f4的函数
};
我们还能把某个函数指定为final,表示禁止该函数被覆盖
struct D : B {
void f1(int) const final; //不允许后续的其它类覆盖f1(int)
};
struct D1 : D {
void f1(int) const; //错误:D已经将f1声明为final
};
类的final指示符
有时我们会定义这样一种类,我们不希望其它类继承它,或者不想考虑它是否适合作为一个基类。我们可以在类名后跟一个关键字final来实现这一目的:
class NoDerived final{/* */}; //NoDerived不能作为基类
class Bad::NoDerived{/* */}; //错误:NoDerived是final的