final 虚拟函数
C++ 11 引入了 final
说明符,如果出现在方法签名中,它禁止方法重写:
class Base {
public:
virtual void foo() {
std::cout << "Base::Foo\n";
}
};
class Derived1 : public Base {
public:
// Overriding Base::foo
void foo() final {
std::cout << "Derived1::Foo\n";
}
};
class Derived2 : public Derived1 {
public:
// Compilation error: cannot override final method
virtual void foo() {
std::cout << "Derived2::Foo\n";
}
};
说明符 final
只能与虚拟成员函数一起使用,不能应用于非虚拟成员函数
与 final
一样,还有一个说明符调用者’覆盖’,它可以防止派生类中的 virtual
函数被覆盖。
说明符 override
和 final
可以组合在一起以产生预期效果:
class Derived1 : public Base {
public:
void foo() final override {
std::cout << "Derived1::Foo\n";
}
};