1

サブタイプとサブクラスの違いは何ですか?また、クラスが別のクラスのサブタイプ/サブクラスであるかどうかをどのように判断できますか?

4

4 に答える 4

4

C++ では、サブクラスを「派生クラス」と呼びます。

C++ では、クラスは型であり、唯一の「サブタイプ」は派生クラスです。したがって、C++ に関連して「サブタイプ」と「サブクラス」という言葉を使用することを選択した場合、それらはおそらく同じものです。学術的な文脈によっては、プライベート継承はサブタイプを作成しないと言うかもしれませんが、その場合は異なります。さらに言えば、一部の学術的文脈では、「サブタイプ」の概念は正当ではありません (正式な型理論は OOP の前に存在していました。その問題については、バベッジを数えない限り、コンピューター サイエンスの前にありました)。

C++11 ではAClass、 がの派生クラスであるかどうかをテストできますAnother(オプションで、それらが同じクラスである場合を除きます)。

std::is_base_of<Another, AClass>::value && !std::is_same<Another, AClass>::value

この式は、継承が非公開の場合でも当てはまります。

于 2012-12-04T10:40:13.847 に答える
2

これらは理論的な概念であり、C++ の概念ではありません。しかし、それらを C++ に適用する方法を見てみましょう。

  • サブクラス化とは、別の型を継承して新しい型を形成することです。C++ はそのメカニズムを提供し、サブクラスを「派生クラス」と呼びます。

  • サブタイプとは、型の値が期待される場所でサブタイプの値を使用できる可能性を指します。C++ では、パブリック継承はサブタイプ関係を暗示していると考えることができます。または、より制限して、仮想関数のオーバーライドが LSP を尊重することを保証する場合のみをサブタイプと考えることができます。また、プライベートまたは保護された継承がそうではないことを考慮すると (ただし、サブクラス化の場合でもあります)、仮想関数のオーバーライドに制約を加えるかどうかにかかわらず、問題はありません。

したがって、いつものように、正確な定義 (意図的に何も与えていません) は、いくつかのコーナー ケース (C++ のプライベートまたは保護された基本クラス) またはドメイン全体 (型テンプレート パラメーターが持つ制約を考慮しますか?) を受け入れるか除外します。型付けシステムに準拠するかどうか? あなたの定義が多くの言語に適用できるほど十分にオープンである場合, 最終的にイエスと答えてしまうかもしれません. したがって, C++ には相互作用を伴う 2 つの型付けシステムがあると考えてください. ) そして通常、正確な定義は、それらが提案されている残りの作業を容易にするために行われます。

于 2012-12-04T12:06:14.303 に答える
1

から: http://www.cs.princeton.edu/courses/archive/fall98/cs441/mainus/node12.html

再利用をサポートする上で、サブタイプとサブクラスの間には重要な違いがあります。サブクラスを使用すると、クラス内のコード (インスタンス変数の宣言とメソッド定義の両方) を再利用できます。したがって、クラス内でのコードの再利用をサポートするのに役立ちます。一方、サブタイピングは外部での再利用をサポートするのに役立ち、ポリモーフィズムの形式を生み出します。つまり、データ型が別のサブタイプであると判断されると、スーパータイプの要素に適用できる関数またはプロシージャは、サブタイプの要素にも適用できます。

記事全体を読む必要があります。

于 2012-12-04T10:37:30.947 に答える
-3

クラスはプログラマーが定義する新しい型なので、サブクラス==サブタイプだと思います。

スティーブ・ジェソップは次のように書いています。

C++ では、サブクラスを「派生クラス」と呼びます。

違うと思う。サブクラスはクラス内のクラスです (エンジンが車の一部であるように)。

以下の例を見てください。

#include <iostream>

using namespace std;

class Car
{
    public:
    class Engine //Engine is subclass
    {
        public:
        static void Start()
        {
               cout << "Engine is starting... \n";
        }      
    };
};

class Animal
{
    public:
    static void Eat()
    {
           cout << "Animal is eating... \n";
    }     
};

class Wolf : Animal //Wolf is derived class
{
      public:
      static void Howl()
      {
             cout << "Wolf is howling... \n";
      }
};

int main()
{
    Car::Engine::Start();
    Animal::Eat();
    Wolf::Howl();

    system("PAUSE"); //keep Console Window open in Debug Mode
    return 0;
}
于 2012-12-04T11:06:00.300 に答える