Javaはとを明確に区別class
しinterface
ます。(C#もそうだと思いますが、経験はありません)。ただし、C ++を記述するとき、クラスとインターフェイスの間に言語による強制的な区別はありません。
そのため、Javaには多重継承がないための回避策としてインターフェイスを常に見てきました。このような区別をすることは、C ++ではarbitrary意的で無意味に感じます。
私は常に「最も明白な方法で物事を書く」アプローチを採用する傾向がありました。そのため、C ++でJavaのインターフェースと呼ばれるものがある場合、例えば:
class Foo {
public:
virtual void doStuff() = 0;
~Foo() = 0;
};
そして、私Foo
はおそらくほとんどの実装者が、おそらく私が書くだろういくつかの一般的な機能を共有したいと決めた。
class Foo {
public:
virtual void doStuff() = 0;
~Foo() {}
protected:
// If it needs this to do its thing:
int internalHelperThing(int);
// Or if it doesn't need the this pointer:
static int someOtherHelper(int);
};
これにより、これはもはやJavaの意味でのインターフェースではなくなります。
代わりに、C ++には、同じ根本的な継承の問題に関連する2つの重要な概念があります。
virtual
相続メンバー変数を持たないクラスは、ベースとして使用するときに余分なスペースを占有することはできません
「基本クラスのサブオブジェクトのサイズがゼロになる場合があります」
それらのうち、可能な限り#1を避けようとします-それが本当に「最もクリーンな」設計であるシナリオに遭遇することはまれです。ただし、#2は微妙ですが、「インターフェイス」という用語の理解とC ++言語機能の重要な違いです。この結果、私は現在(ほとんど)C ++で「インターフェース」と呼ばれることはなく、基本クラスとそのサイズの観点から話しています。C ++のコンテキストでは、「インターフェイス」は間違った名前だと思います。
多くの人がそのような区別をしないのに、それが私の注意を引いた。
- C ++の「インターフェース」内に(たとえば
protected
)非virtual
関数が存在することを許可することにより、何かを失うことになるのでしょうか (私の気持ちはまったく逆です-共有コードのより自然な場所) - 「インターフェイス」という用語はC ++で意味がありますか?それは純粋なだけを意味するの
virtual
ですか、それともメンバー変数のないC ++クラスをインターフェイスと呼ぶのが公平でしょうか?
~Foo() {}
抽象クラスのパブリックは、(ほとんど)すべての状況下でエラーです。
internalHelperThing
ことにより、ほとんどすべての場合にシミュレートできます。