web-dev-qa-db-ja.com

抽象メソッドと純粋仮想関数は同じものですか?

私の知る限り、抽象メソッドと純粋な仮想関数はどちらも機能を提供しません...それで、両方が同じものだと言えますか?

また、クラス(必ずしも抽象として宣言されているわけではない)には、実装されたメソッド(抽象または仮想ではない)の数が含まれているが、純粋な仮想関数が含まれているとします。このクラスは抽象ですか?

52
Ahmad

はい、それらは同じものです。 C++では、抽象メソッドは純粋仮想関数の特性を記述する別の方法です。どちらも、クラスを実際にインスタンス化する前にサブクラスで実装する必要がある、実装のないメソッドを意味します。

C++の純粋仮想関数と抽象クラスの状況は、本質的にまったく同じことを意味するため、似ています。抽象クラスには、少なくとも1つの純粋な仮想関数が必要です。そうでない場合、インスタンス化でき、抽象ではありません。同様に、少なくとも1つの純粋仮想関数を持つクラスは、メソッドを実際に実装できるように拡張する必要があるため、抽象クラスでなければなりません。

したがって、クラスは抽象クラスですif and if if少なくとも1つの純粋仮想関数/抽象メソッドが含まれています。

後で、JavaやC#などの言語により、このようなことがより明確になり、純粋な仮想関数の存在ではなく、特別なキーワードでクラス抽象を定義できるようになりました。これらの言語のようなものですが、それについてはもう少し明示的です。

57

C++では、クラスまたはメソッドを抽象として明示的に宣言しません。純粋仮想メソッドの存在は、それらを抽象化するものです。

15
Jordão

はい、抽象メソッドは純粋な仮想関数とまったく同じものです。これらの用語はしばしば同じ意味で使用されます。 IMO、「純粋な仮想関数」は、C++の技術的に正しい用語であり、関数が0に設定されているという事実を具体的に示しています。

class myClass {
public:
  virtual void vfunc() = 0; // pure specifier
};

抽象クラスは 定義者

基本クラスとして特別に使用されるように設計されたクラス。抽象クラスには、少なくとも1つの純粋仮想関数が含まれます。

したがって、基本的に、抽象クラスは基本クラスになるように設計されているため、抽象クラスです(定義により、一部の基本クラスは、純粋仮想である必要がある実装可能なメソッドを持つ必要があります)。これらのクラスは、使用方法や拡張方法によって単純に抽象クラスになります。 Javaなどの言語とは異なり、abstractまたはinterfaceキーワード修飾子はないため、C++の抽象クラスについて話すには「言語契約」が必要です。

6
David Titarenco

C++では、純粋な仮想メンバー関数により、囲み型が「抽象型」になります。

この用語は頻繁に誤用されますが、関数自体を抽象化することはできません。

はい、抽象メソッドと純粋仮想関数は概念的に同じものです。

また、クラス(必ずしも抽象として宣言されているわけではない)には、実装されたメソッド(抽象または仮想ではない)の数が含まれているが、純粋な仮想関数が含まれているとします。このクラスは抽象ですか?

少なくとも1つの純粋仮想関数を持つクラスは、抽象クラスと呼ばれます。

3
Akhil