1

最近、同僚の1人が、「サブタイプ」の概念はC++では定義されていないと主張しているのを聞きました。彼は、「サブタイプ」はC++の用語では「派生型」と正しく呼ばれていると主張しています。これは本当ですか?私が持っている場合:

class A { }; class B : public A { };

BをAのサブタイプと呼ぶことはできますか?それとも、C++でBをAの「派生型」と呼ぶことだけが有効ですか?

4

4 に答える 4

2

サブタイプは、C++の一般的な専門用語の一部ではありません。ウィキペディア(Chadに感謝)の定義は非常に広く、C ++では、継承を含むがこれに限定されない複数の異なるものを表すことができます。たとえば、特定のカテゴリとポインタのすべてのイテレータタイプは、その概念を必要とするテンプレート(標準ライブラリアルゴリズムを含む)で置き換えることができるため、イテレータ概念のサブタイプにすることができます。

私は一般的に派生語を使用しますが、同じ(異なる言語で)他の代替語にはextends(タイプA extends B)またはinheritsを含めることができます。

于 2012-11-28T18:47:57.693 に答える
0

サブタイプは、タイプの特殊なバージョンです。C ++では、派生クラスは基本クラスタイプのサブタイプ(サブクラス)です。派生型の変数は、親型の変数が要求された場所であればどこにでも現れる可能性があります。別のタイプのサブタイプは、親タイプを使用できるすべての状況でサブタイプを使用できることを意味します。

MSDNから:

派生型は、プログラムで使用できる新しい型であり、直接派生型と合成派生型を含めることができます。

于 2012-11-28T18:49:29.673 に答える
0

ウィキペディアによると:

SがTのサブタイプである場合、サブタイピング関係はしばしばS <:Tと記述されます。これは、タイプTの用語が予想されるコンテキストで、タイプSの任意の用語を安全に使用できることを意味します。

この定義は、パブリック継承が次のクラスに適合することを意味します。

class T {};
class S : public T {};

ただし、C ++は継承も提供しますprivateprotectedこれらは継承が行う「is-a」関係をモデル化していないpublicため、これらのタイプの継承はサブタイプの定義を満たしていません(ウィキペディアで提供されています)。

サブタイプは、定義が適合しているように見える場合でも(public継承)、C++でこれらの関係を記述する一般的な方法ではありません。

于 2012-11-28T18:51:17.007 に答える
0

Stroustrupは「派生クラス」を好むようですが、「サブクラス」とも呼ばれます。このリンクを参照してください。

http://www.stroustrup.com/hopl2.pdfで、彼は次のように書いています。

派生クラスの概念は、C ++バージョンのSimulaの接頭辞付きクラス概念であり、したがってSmalltalkのサブクラス概念の兄弟です。派生クラスと基本クラスの名前が選択されたのは、何がサブで何がスーパーであるかを思い出せず、この特定の問題を抱えているのは私だけではないことを観察したためです。

于 2012-11-28T18:54:45.120 に答える