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 函数被覆盖。

说明符 overridefinal 可以组合在一起以产生预期效果:

class Derived1 : public Base {
public:
    void foo() final override {
        std::cout << "Derived1::Foo\n";
    }
};