2

次の2つの宣言の違いは何ですか?

virtual void calculateBase() = 0;  
virtual void calculateBase();

最初のもの(= 0)は「純粋な抽象関数」であると読みましたが、それが2番目のものを作るのは何ですか?

4

8 に答える 8

8

最初のものは「純粋な仮想」です。クラスを抽象化し、インスタンス化しようとするとコンパイラ エラーが発生します。これは、派生クラスが純粋仮想関数を実装することによって必要な動作を実装する基本クラスとして使用されることを意図しています。基本クラスに関数を実装する必要はありませんが、可能です。
これは、2 つの設計パターンでよく使用されるパターンです。

  • テンプレート メソッド」デザイン パターン。基本クラスは関数呼び出しの周りに構造を実装しますが、関数呼び出しの詳細は派生クラスによって埋められる必要があります。
  • C++ には interface キーワードがないため、"interface" デザイン パターン。理想的には純粋仮想関数のみを持ち、メンバー データを持たない抽象基底クラスは、インターフェイスを定義する C++ の方法です。

2 番目の宣言は、通常の仮想メンバー関数の宣言です。基本クラスにメンバー関数を実装しないと、コンパイラ エラーが発生します。これはまだ仮想であるため、派生クラスで動作をオーバーライドすると便利な場合があります。

于 2009-09-14T09:43:32.917 に答える
7

最初のものは純粋仮想関数と呼ばれます。通常、純粋仮想関数には実装がなく、純粋仮想関数を含むクラスのインスタンスを作成することはできません。

2 つ目は、仮想関数 (つまり、「通常の」仮想関数) です。クラスはこの関数の実装を提供しますが、その派生クラスは、このメソッドに独自の実装を提供することで、この実装をオーバーライドできます。

于 2009-09-14T09:40:50.770 に答える
4

最初のものは基本クラスで実装する必要はありませんが、継承されたクラスで実装するように強制します。

2 番目のものは基本クラスに実装する必要があり、継承されたクラスに実装できます。

于 2009-09-14T09:40:26.590 に答える
3

基本的に、継承する場合、最初のものをオーバーライドする必要があり、2 番目のものをオーバーライドすることが許可れています。

Java出身ですね。

于 2009-09-14T09:40:37.203 に答える
1

仮想ボイドcalculateBase()= 0;

最初の関数は、クラスで実装を実行できない純粋仮想関数であり、純粋抽象クラスまたはインターフェイスクラスとして機能します。具体的な実装は、サブクラスで実行またはオーバーライドする必要があります。派生クラスへのインターフェイスクラスとして機能します。

仮想ボイドcalculateBase();

この関数は、基本クラスで実装(デフォルト)を実行できる仮想関数です。ただし、派生クラスはそれ自体の実装をオーバーライドする必要があります。

于 2009-09-14T11:37:43.067 に答える
1

私はあなたが用語を混ぜていると思います...

virtual void x() = 0;

純粋仮想関数または抽象関数です。実装のない仮想関数です。インターフェイスに相当する C++ である純粋な抽象クラスについて、抽象関数のみを持つクラスについて話します。

virtual void x();

は仮想関数です。つまり、派生クラスで再定義できますが、抽象的ではないため、実装を提供する必要があります。

于 2009-09-14T09:43:01.010 に答える
0

2 番目の関数は、それを宣言するクラスに実装が必要であり ('= 0' がない)、サブクラスによってオーバーライドできます。

最初の関数は、それを宣言するクラスに実装がある場合とない場合があり、サブクラスによって実装する必要があります

于 2009-09-14T09:41:52.517 に答える