2

私は継承(C ++でのテスト)の概念を理解しようとしています。ここからの引用:http://en.wikipedia.org/wiki/Inheritance_ (object-oriented_programming )

「オブジェクト指向プログラミング(OOP)では、継承は、プログラミング言語のサポートに応じて、既存のオブジェクトのコードを再利用するか、既存のオブジェクトからサブタイプを確立するか、またはその両方を行う方法です。」

次に、このコードをテストしました。

class Person
{
public:
    int ii;
    Person():ii(0){}
};
class Student : public Person
{
};
class Student1 : public Person
{
};

それで、

Person p;
Student s;
Student1 s1;
s.ii = 222;
p.ii = 333;
cout << s.ii << endl; // prints 222
cout << s1.ii << endl; // prints 0
cout << p.ii << endl; // prints 333

結果に示されているように、各サブクラスには独自のバージョンのii変数があり、それぞれが基本クラスからコピー値を取得します。したがって、1つを変更しても、他には影響しません。

それは私が最初に頭に浮かんだことではありません。基本クラスから継承する場合、すべてのサブクラスが同じ属性のインスタンスを継承すると思いました。各サブクラスは、独自のバージョンを保持する必要はありません。そして、それは再利用とスペース節約の利点を利用することができます。

私は何かを誤解していますか?そして、私が正しければ、他のOOP言語にも当てはまりますか?(静的変数を使用して自分の考えに到達できることはわかっていますが、それは私が話していることではありません)

4

2 に答える 2

3

クラスのインスタンスが3つあるので、それらは独立しています。つまり、サブクラスはを宣言する必要はありませんii。クラスをテンプレートのように考えて(ただし、言語構成テンプレートと混同しないでください)、それらのインスタンスを作成します。

すべてのPersonsが常に同じフィールド値を持つようにしたくないですか?

そうは言っても、静的変数を探しているかもしれません(おそらくそうではない/うまくいけばそうではない) 。

オブジェクト指向でインスタンスクラスを検索します。

于 2012-05-06T15:15:13.963 に答える
2

クラスは既存のエンティティとしてではなく(少なくともC ++では)、クラスインスタンスの動作を説明するパターンとして扱う必要があります。つまり、何らかの方法で作成された個々のオブジェクト(C ++では)です。明示的または暗黙的なコンストラクターを使用します)。

このコードは、クラスのインスタンスとしてStudent s;記述されています。クラス定義の各フィールドは、クラス自体ではなく、インスタンスを参照します。sStudent

ただし、静的フィールドを宣言することはできます。これは、のすべてのインスタンス間で共有され、単一のインスタンスが作成されていない場合でも、インスタンス変数とは逆に、これをクラスStudent変数として見ることができます。

それで、あなたの質問に戻ってください:サブクラスはパターンを継承します:インスタンスにいくつかのフィールド/メソッドが存在するという事実。ただし、値はインスタンスに対して完全に個別です(クラス(静的)変数を除く)。

C ++の継承はクラスレベルでのみ存在し、インスタンスレベルでは存在しません。

于 2012-05-06T15:21:38.907 に答える