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";
    }
};