例: Base クラスに実装 (doSomething() など) があります。
すべての派生クラスでこの実装のみを使用し、基本クラスの実装をオーバーライドしないようにします。
C++ でこの動作を強制するにはどうすればよいですか?
例: Base クラスに実装 (doSomething() など) があります。
すべての派生クラスでこの実装のみを使用し、基本クラスの実装をオーバーライドしないようにします。
C++ でこの動作を強制するにはどうすればよいですか?
基本クラスにのみ実装する場合は、宣言しないでくださいvirtual
。オーバーライドすることはできません。
C++11 ではfinal
、Java と同様の方法でオーバーライドを宣言できます。
virtual void doSomething() final;
^^^^^
C++03 以前ではできません。そのため、C++11 に追加されました。
C++11 では、メソッドを として宣言しfinal
ます。
C++03 では、組み込みの (言語が提供する) 機能はありませんが、次のことができます。
virtual
基本クラスのように メソッドを宣言しないでください。#1
: 派生クラスが特定のメソッドをオーバーライドできないようにします。メソッドはオーバーライドできないため、すべてのオブジェクト (ベースまたは派生) に対して同じメソッドを呼び出す必要があります。
#2
: これにより、関数の非表示がなくなり、基本クラスのメソッドが非表示になる可能性がなくなります。
#3
: これは、クラスのユーザーに、根拠と目的を警告します。
最終関数がクラス階層の基本クラスにある場合は、それを virtual として宣言しないでください。その後、オーバーライドすることはできません。
最終関数が基本クラスにない (つまり、仮想関数である) 場合は、C++11 の最終識別子を使用して、関数の最終を宣言できます。
struct Base2 {
virtual void f() final;
};