添加到上面的好答案 - 这是一个众所周知的 final 应用程序(非常受 Java 启发)。假设我们在 Base 类中定义了一个函数 wait(),并且我们希望在它的所有后代中只实现一个 wait()。在这种情况下,我们可以将 wait() 声明为 final。
例如:
class Base {
public:
virtual void wait() final { cout << "I m inside Base::wait()" << endl; }
void wait_non_final() { cout << "I m inside Base::wait_non_final()" << endl; }
};
这是派生类的定义:
class Derived : public Base {
public:
// assume programmer had no idea there is a function Base::wait()
// error: wait is final
void wait() { cout << "I am inside Derived::wait() \n"; }
// that's ok
void wait_non_final() { cout << "I am inside Derived::wait_non_final(); }
}
如果 wait() 是纯虚函数,那将是无用的(并且不正确) 。在这种情况下:编译器会要求您在派生类中定义 wait()。如果你这样做,它会给你一个错误,因为 wait() 是最终的。
为什么最终函数应该是虚函数?(这也令人困惑)因为(imo)1)final的概念与虚函数的概念非常接近【虚函数有很多实现--final函数只有一种实现】,2)很容易实现final效果使用虚表。