final和override说明符出现在形参列表(包括任何const或者引用修饰符)以及尾置返回类型之后
override
派生类如果定义了一个函数与基类中的虚函数名字相同但是形参列表不同,这仍然是合法的行为
编译器将会认为新定义的这个函数与基类中原有的函数相互独立
派生类中的函数并没有覆盖掉基类中的函数版本
这实际上是一个错误,但是编译器并没有发现这个错误
C++11中可以使用override关键字来说明派生类中的虚函数
如果派生类中使用了override标记了某个函数,但该函数并没有覆盖基类中已存在的虚函数,此时编译器将会报错
struct A {
virtual void fun1(int) const;//const成员函数中不能改变成员变量
virtual void fun2();
void fun3();
};
struct B : A {
void fun1(int) const override;//正确,派生类中的fun1也是虚函数,fun1覆盖掉基类中已存在的fun1
void fun2(int) override;//错误,基类A中没有形式fun2(int)的函数,声明不匹配
void fun3() override;//错误,fun3()不是虚函数,只有虚函数才能被覆盖
void fun4() override;//错误,基类A中没有名为fun4的函数
};
final
虚函数使用final
我们还可以把某个函数指定为final
某个函数被定义成final以后,任何尝试覆盖该函数的操作都将引发错误
struct A {
virtual void fun1(int) const;//const成员函数中不能改变成员变量
virtual void fun2();
void fun3();
};
struct B : A {
//从A继承fun2()和fun3(),覆盖fun1(int)
void fun1(int) const final;//不允许后续其他类覆盖fun1(int)
};
struct C : B {
//从B继承fun3(),覆盖fun2()
void fun2();//正确,覆盖从间接基类A继承而来的fun2()
void fun1(int) const;//错误,B已经将fun1声明成了final
};
类使用final
定义一个类
- 不希望其他类继承它
- 或者不想考虑它是否适合作为一个基类
在类名后面加一个final关键字,防止继承发生
class A final {
//类成员
};