2012-05-06 13 views
2

私は継承(C++でのテスト)の概念を理解しようとしています。 "オブジェクト指向プログラミング(OOP)では、継承は、既存のオブジェクトのコードを再利用する方法、または既存のオブジェクトからサブタイプを確立する方法です。プログラミング言語のサポートによって、継承は既存オブジェクトのコードを再利用する方法です。結果に示されるように、サブクラスの各々を次にサブクラスがC++の基本クラスから継承するものは何ですか?

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変数の独自のバージョンを持ち、それぞれが基本クラスからコピー値を取得します。したがって、変更した場合、他のものには影響しません。

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

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

+0

静的変数は、すべてのインスタンスで何かを共有したい場合に使用します。 – chris

+0

まずクラスが何であるかを理解する必要があります。クラスは*タイプ*です。 C++では、すべてのオブジェクトは特定の型であり、変数はオブジェクトです。継承は、オブジェクトではなく*型*を整理する方法です。 –

答えて

3

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

あなたはすべてのPersonに同じフィールド値を持たせたくありませんか?

と言っていますが、のstaticという変数を探している可能性があります。

オブジェクトの向きがの場合クラスを参照してください。

2

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

コードStudent s;は、Studentのインスタンスとしてsを示しています。クラス定義内の各フィールドは、クラスそのものではなくインスタンスを参照します。

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

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

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

+0

私は今興味をそそられています。言語はクラスではない*青写真ではない? – chris

+0

@chris:javascript? – Vlad

+0

ああ、私はOOPの経験がありませんでした。 – chris

関連する問題