最近、同僚の1人が、「サブタイプ」の概念はC++では定義されていないと主張しているのを聞きました。彼は、「サブタイプ」はC++の用語では「派生型」と正しく呼ばれていると主張しています。これは本当ですか?私が持っている場合:
class A { };
class B : public A { };
BをAのサブタイプと呼ぶことはできますか?それとも、C++でBをAの「派生型」と呼ぶことだけが有効ですか?
最近、同僚の1人が、「サブタイプ」の概念はC++では定義されていないと主張しているのを聞きました。彼は、「サブタイプ」はC++の用語では「派生型」と正しく呼ばれていると主張しています。これは本当ですか?私が持っている場合:
class A { };
class B : public A { };
BをAのサブタイプと呼ぶことはできますか?それとも、C++でBをAの「派生型」と呼ぶことだけが有効ですか?
サブタイプは、C++の一般的な専門用語の一部ではありません。ウィキペディア(Chadに感謝)の定義は非常に広く、C ++では、継承を含むがこれに限定されない複数の異なるものを表すことができます。たとえば、特定のカテゴリとポインタのすべてのイテレータタイプは、その概念を必要とするテンプレート(標準ライブラリアルゴリズムを含む)で置き換えることができるため、イテレータ概念のサブタイプにすることができます。
私は一般的に派生語を使用しますが、同じ(異なる言語で)他の代替語にはextends(タイプA extends B)またはinheritsを含めることができます。
サブタイプは、タイプの特殊なバージョンです。C ++では、派生クラスは基本クラスタイプのサブタイプ(サブクラス)です。派生型の変数は、親型の変数が要求された場所であればどこにでも現れる可能性があります。別のタイプのサブタイプは、親タイプを使用できるすべての状況でサブタイプを使用できることを意味します。
MSDNから:
派生型は、プログラムで使用できる新しい型であり、直接派生型と合成派生型を含めることができます。
ウィキペディアによると:
SがTのサブタイプである場合、サブタイピング関係はしばしばS <:Tと記述されます。これは、タイプTの用語が予想されるコンテキストで、タイプSの任意の用語を安全に使用できることを意味します。
この定義は、パブリック継承が次のクラスに適合することを意味します。
class T {};
class S : public T {};
ただし、C ++は継承も提供しますprivate
。protected
これらは継承が行う「is-a」関係をモデル化していないpublic
ため、これらのタイプの継承はサブタイプの定義を満たしていません(ウィキペディアで提供されています)。
サブタイプは、定義が適合しているように見える場合でも(public
継承)、C++でこれらの関係を記述する一般的な方法ではありません。
Stroustrupは「派生クラス」を好むようですが、「サブクラス」とも呼ばれます。このリンクを参照してください。
http://www.stroustrup.com/hopl2.pdfで、彼は次のように書いています。
派生クラスの概念は、C ++バージョンのSimulaの接頭辞付きクラス概念であり、したがってSmalltalkのサブクラス概念の兄弟です。派生クラスと基本クラスの名前が選択されたのは、何がサブで何がスーパーであるかを思い出せず、この特定の問題を抱えているのは私だけではないことを観察したためです。