1

例: Base クラスに実装 (doSomething() など) があります。

すべての派生クラスでこの実装のみを使用し、基本クラスの実装をオーバーライドしないようにします。

C++ でこの動作を強制するにはどうすればよいですか?

4

3 に答える 3

3

基本クラスにのみ実装する場合は、宣言しないでくださいvirtual。オーバーライドすることはできません。

C++11 ではfinal、Java と同様の方法でオーバーライドを宣言できます。

virtual void doSomething() final;
                           ^^^^^

C++03 以前ではできません。そのため、C++11 に追加されました。

于 2012-04-06T09:30:41.633 に答える
2

C++11 では、メソッドを として宣言しfinalます。

C++03 では、組み込みの (言語が提供する) 機能はありませんが、次のことができます。

  • virtual基本クラスのように メソッドを宣言しないでください。
  • 派生クラスに同じ名前のメソッドを追加しないでください。
  • 目的を適切に文書化します。

#1: 派生クラスが特定のメソッドをオーバーライドできないようにします。メソッドはオーバーライドできないため、すべてのオブジェクト (ベースまたは派生) に対して同じメソッドを呼び出す必要があります。

#2: これにより、関数の非表示がなくなり、基本クラスのメソッドが非表示になる可能性がなくなります。

#3: これは、クラスのユーザーに、根拠と目的を警告します。

于 2012-04-06T09:32:40.027 に答える
2

最終関数がクラス階層の基本クラスにある場合は、それを virtual として宣言しないでください。その後、オーバーライドすることはできません。

最終関数が基本クラスにない (つまり、仮想関数である) 場合は、C++11 の最終識別子を使用して、関数の最終を宣言できます。

struct Base2 {
    virtual void f() final;
};
于 2012-04-06T09:33:27.953 に答える