2

インタビューの質問は次のとおりです。

純粋仮想関数を使用せずに抽象基底クラスを実装するにはどうすればよいでしょうか。クラスのオブジェクトを作成できないようにするためにできること。その場合、クラスは抽象基本クラスであると言えます。

最初は仮想デストラクタを使用することを考えましたが、仮想キーワードのため、この解決策についてはわかりません。助けていただけますか?

4

2 に答える 2

5

あなたは 2 つの質問をします。

純粋仮想関数を使用せずに抽象基底クラスを実装するにはどうすればよいでしょうか?

抽象クラスの定義によると、それは不可能です:「少なくとも1つの純粋仮想関数がある場合、クラスは抽象です」(C++11 §10.4/2)。したがって、クラスを抽象化するには、純粋仮想関数を宣言するか、派生元の別のクラスから継承する必要があります。

クラスのオブジェクトを作成できないようにするにはどうすればよいでしょうか?

この質問はさまざまな方法で解釈でき、それぞれに異なる解決策があります。

  1. 文字通りに解釈すると、この質問は、インスタンスを作成できない型を要求します。コンストラクターが定義されていないクラスは構築できません。

    これを実現するには、クラスのデフォルト コンストラクターとコピー コンストラクターを宣言する (定義しない) 必要があります。C++11 の削除された特別なメンバー関数をサポートするコンパイラを使用している場合は、削除済みとして宣言する必要があります。

  2. 最初の質問の文脈から考えると、別のクラスの基本クラス サブオブジェクトとしてのみインスタンス化できるクラスを定義することを意図している可能性が高いようです。

    これは、すべてのコンストラクターを保護されていると宣言し、クラスのインスタンスを作成する静的ファクトリ メンバー関数を提供せず、他のクラスや関数と友好関係を持たないようにすることで実現できます。

于 2012-07-07T21:38:38.643 に答える
0

仮想デストレーターは必要なジョブを実行しません。次のいずれかを実行できます。

  1. 定義を使用して純粋仮想デストラクタを宣言します。
  2. 基本クラスのコンストラクターを保護します。

より明確な説明については、純粋仮想メソッドを使用せずにクラスを抽象化するを参照してください。

于 2012-07-07T21:17:29.723 に答える