web-dev-qa-db-ja.com

純粋な仮想関数のみを含むC ++クラス:何と呼ばれますか?

だから私はこのようなものを説明するためにどのような用語を使用すべきかについての入力/コンセンサスを探しています:

class Printable
{
  public:
    virtual void printTo(Printer *) = 0;
    virtual double getWidthInPoints() = 0;
    virtual double getHeightInPoints() = 0;
};

したがって、これは純粋な仮想メソッドのみを持つクラスです。それを継承するクラスはすべてを実装する必要があります。つまり、部分的な実装はありません。

それで、これは何と呼ばれているのですか?

私は主に2つの異なる名前を見てきました。

1)インターフェース

Windows COMプログラミング (おそらく IDLからのもの )で使用されます C#Java の両方のキーワードですまた、 Objective-Cのコンパイラディレクティブ/キーワード (ただし、同じことではありません)。 「インターフェース」という言葉を「API」と同義語として使用しているエンジニアの話を聞いたことがありますが、少なくともこのシナリオでは、APIが複数で構成されている可能性があるのに対して、それは単一のものです。

2)プロトコル

これは Bloomberg BSL などのさまざまなオープンソースライブラリで使用されており、 Objective-Cのコンパイラディレクティブ/キーワード ですが、必ずしも継承階層。より広いコンピュータサイエンスの意味で、プロトコルは、2つのパーティ間の情報交換の正式な定義です。たとえば、TCPやHTTPなどですが、この定義は、上記のクラスにも当てはまります。

C++でこれらの間に明確な違いはありますか、それともほとんど互換性がありますか?

4
JBRWilkinson

純粋な仮想関数を持つクラスの専門用語は抽象的なクラスですが、その用語は、クラスに追加の非純粋な仮想関数がある場合にも適用されます。

C++ではInterfaceという用語がよく使われ、Printableのような抽象クラスを表します。これは、C#/ Javaでのinterfaceキーワードの使用に対応しています。

C++クラスに関連して「プロトコル」という用語に出会ったことはありません

  • インターフェイスまたはプロトコルとして純粋な仮想関数のみを使用してC++クラスを呼び出すことができます。

  • インターフェイスとプロトコルはどちらも同じ概念です。

  • Java/C#プログラマーの場合は、インターフェースとしてpurt仮想関数のみを使用してクラスを呼び出します。 Objective-Cプログラマーであれば、プロトコルとしてPurt仮想関数のみを使用してクラスを呼び出します。

3
Edward Shen