すでに上で述べたように、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) に対する他の純粋仮想メソッド。