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