从C++11开始,继承体系新增关键字override和final,让继承和成员函数覆盖更加规范和安全,在编译期做了保证。
override关键字
在成员函数的声明或定义中,override表示该成员方法是virtual的,并且是用来覆盖基类的虚函数。
- 如果基类没有匹配的虚函数,将会编译报错,这在保证程序正确性方面非常有用,因为在C++11之前,派生类只能声明重写基类虚函数,甚至不用加virtual关键字,而且如果函数签名不一致,编译器也不会报错,会当成新的成员函数。
- 另外,override已经表明成员函数是virtual的了,方法最好不要再冗余的再声明为virtual的了。
例子:
struct A
{
virtual void foo() {}
void bar() {}
};
struct B : A
{
// Error: 签名不匹配,非const
// void foo() const override;
// 签名匹配 B::foo overrides A::foo
void foo() override {}
// Error: A::bar 非 virtual
// void bar() override;
};
final关键字
成员函数声明
当final用在virtual函数的声明或定义中,确保该方法是virtual的(无论是当前直接声明为virtual或者从基类继承的virtual方法),并且不能再在派生类中覆盖。
struct A
{
virtual void foo() final {}
// Error: 非虚函数不能设为final
//void bar() final;
virtual void bar2() {}
};
// struct B is final
struct B final : A
{
// foo不能再覆盖
// void foo();
void bar2() final {}
};
类声明
当类声明用final修饰后,表示该类不能被继承