上記の素晴らしい回答に追加する - これはよく知られている final のアプリケーションです (Java から非常にインスピレーションを得ています)。Base クラスで関数 wait() を定義し、そのすべての子孫で wait() の実装を1 つだけにしたいとします。この場合、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() が final であるため、エラーが発生します。
最終関数を仮想にする必要があるのはなぜですか? (これも紛らわしいです)(imo)1)最終的な概念は仮想関数の概念に非常に近いため[仮想関数には多くの実装があります-最終的な関数には実装が1つしかありません]、2)最終的な効果を実装するのは簡単ですvtables を使用しています。