私は以下を見ています:
そして、C++ の抽象クラスには純粋仮想関数が含まれていると書かれています。しかし、確かにこれは抽象クラスを作成することを意味するものではなく、純粋な仮想関数を挿入するだけですか? 特定の関数の実装を提供しない具体的なクラスがあるため、抽象化され、派生クラスに実装を提供するように強制する状況はありませんか? しかし、これはクラスを抽象化しませんか?
では、「これは抽象クラスです」と「これは 1 つの純粋仮想関数を持つ具象クラスです」をどのように区別すればよいでしょうか。
私は以下を見ています:
そして、C++ の抽象クラスには純粋仮想関数が含まれていると書かれています。しかし、確かにこれは抽象クラスを作成することを意味するものではなく、純粋な仮想関数を挿入するだけですか? 特定の関数の実装を提供しない具体的なクラスがあるため、抽象化され、派生クラスに実装を提供するように強制する状況はありませんか? しかし、これはクラスを抽象化しませんか?
では、「これは抽象クラスです」と「これは 1 つの純粋仮想関数を持つ具象クラスです」をどのように区別すればよいでしょうか。
クラスが 1 つ以上の純粋仮想関数を持っている場合、そのクラスはまさに抽象的です。すべての機能が実装されているためインスタンス化できる(基本)クラスを作成しても、重要な機能が欠落している場合、それは単にクラスの設計が間違っています。この場合、基本クラスは完全ではなく、実装されていない純粋な仮想関数を追加する必要があります。これにより、抽象クラスになります。
抽象クラスから派生した派生クラスがあり、基本クラスのすべての関数を実装していない場合、それもまた抽象です。この場合、継承によって抽象化されるため、純粋仮想関数自体は必要ありません。
クラスが抽象であることを示すin のようなabstractキーワードは にはありません。C++Java
すでに上で述べたように、C++ の抽象クラスは、定義上、少なくとも 1 つの純粋仮想関数を持つクラスです。クラスが抽象的であるということは、そのインスタンスを作成できないことを意味し (それから派生した「具体的な」クラスのみ)、「存在しない」純粋仮想関数を呼び出さないように保護します (技術的には、基本クラスのコンストラクターからそれらを呼び出すことはできますが)。 /destructor を実行すると、厄介なランタイム クラッシュが発生します)。
C++ には明示的な「インターフェイス」の種類のクラスはありません。そのため、他の関数が純粋仮想であるためにクラスがすでに抽象化されているかどうかに関係なく、任意のクラスの一部の関数を自由に実装できます。
余談ですが、「実際の」メソッドを純粋仮想化することなく、クラスを抽象化する 1 つの方法を指摘したいと思います。クラスのデストラクタを純粋仮想化するだけで十分です (一般的には、ポリモーフィック クラスのデストラクタを仮想化することをお勧めします)。ここでの小さな落とし穴は、この特定のケース (デストラクタの場合のみ) では、リンカーが満足できるように実装を提供する必要があることです。次のようになります。
class A // abstract class
{
public:
virtual ~A() = 0 {} // destructor is pure virtual, but still needs a body
};
class B : public A {}; // concrete class deriving from an abstract class
また、この特定のケースでは、クラス B は具象化するために独自のデストラクタを明示的に実装する必要がないことに注意してください。したがって、クラス B も抽象化したい場合は、同じトリックをもう一度繰り返す (またはいくつか追加する) 必要があります。 B) に対する他の純粋仮想メソッド。