2012-03-17 21 views
0

an answer on Inheritance: why is there a difference in behaviour between inherited and supplied variables?から、xのコピーが1つしかないので、以下のコードは0を出力することを理解します。継承は実際にはクラスのメンバーを継承しますか?

#include<iostream> 
using namespace std; 

class A { 
    public: 
     int x; 
     A() { x = 10; } 
}; 

class B : public A { 
    public: 
     B() { x = 0; } 
}; 

int main() { 
    A* ab = new B; 
    cout << ab->x << endl; // prints 0 
} 

しかし、これは継承の意味に反するものではありませんか?

私はclass Aから公にinteritするclass Bをコード化された、と私はにそれを期待はab->x印刷値10をもたらしているはずである、メンバ変数xのコピーを継承します。

私はここで何が欠けていますか?私はそれがなぜ継承にもかかわらず0を印刷するのを理解するのが難しいと思っています。

+0

コンストラクタでxを0に設定しているため、0が出力されます。私は正直なところ、この質問を理解していません。 – sepp2k

+0

@ sepp2k:abの型は 'class A'です。 'class A'の' x'は10にのみ設定され、0には設定されていませんでした。 – Lazer

+0

@ sepp2k:OPは、 'B'でアクセスする' x'は ' A 'であり、そうではない。 – Philipp

答えて

4

は、ここで簡単にメンバ変数の観点で継承を説明する簡単な図である。ChildClassが作成されると

enter image description here

BaseClassが作成され、ChildClass内に存在します。変数a,bおよびcは、ChildClassBaseclassの両方からアクセスできます(public、private、protectedなどのアクセス修飾子によって異なります)。 共有されています。コピーされません。

+0

あなたの例の 'BaseClass'メンバは共有されていますが、独立したクラスとして存在します(' BaseClass * 'はまだそれを指し、' ChildClass'の存在を知らないという意味で)。興味深い、ありがとう! – Lazer

+0

@Lazerあなたはそれを持っています:) – unexplored

+1

はい。ただし、クラスを指すことはできず、オブジェクト(クラスのインスタンス)のみを指すことができます。 –

1

私はそれがありません、あなたがコピーによって継承されませんメンバ変数X

のコピーを継承すると予想。 BAのサブオブジェクトを含むBのすべてのオブジェクトの結果としてAを継承します。 xAで定義されているので、xに割り当ててAサブオブジェクトを変更します。

#include <iostream> 

using namespace std; 

struct A { 
    int x; 
    A() { x = 10; } 
}; 

struct B { 
    A subobject; 
    B(): subobject() { this->subobject.x = 0; } 
}; 

int main() { 
    B* ab = new B; 
    cout << ab->subobject.x << endl; // prints 0 
} 

種類ABは今、それ以上に関連していないので、これは(あなたがABから変換することはできませんもちろん継承と同一ではありません。

次のコードの再定式化は、目に見えるこのサブオブジェクトを作ります)、それは継承を使用するときにコンパイラが見るものと幾分類似しています。

0

BAAのコンストラクタに値10が設定されています)を継承しますが、すぐにコンストラクタで0に設定します。

ABで共有されているのはxです。

1

inherit a copy of member variable x - よく、それはコピーを継承しません、それは単に変数を継承します。そしてそれはしました。

最初にAのコンストラクタが実行されます(x = 10)。コンストラクタがB(x = 0)です。その後、xは明らかに0です。

あなたのコメントに基づいて、私はあなたの構図を探してない継承思う:

class B { 
    public: 
    A a; 
    int x; 
}; 
+0

しかし 'class A'の' x'のコピーは1 – Lazer

+0

のままです。 'x'は1つだけです。そして、*もう一度、* no *コピー。アップデートをチェックする。 –

+0

@Lazer _class_にはメンバ変数はなく、クラスのインスタンス化されたオブジェクトのみです!この場合、オブジェクトは1つしかないので、1つの 'x'だけです。 –

0

それとも別の言い方をすると、への暗黙の0らしまたは10ネスはありませんメンバーx。何が起こるかは、呼び出しでBというコンストラクターを呼び出すために発生します。 xAまたはBに定義されているかグローバル変数として定義されているかは関係ありません。Bのコンストラクタは0に設定されているため、0になります。

これは役に立ちますか?

+0

Bで再定義された場合、印刷された値は10になってしまうので問題ありません。 – Lazer

+0

その後、質問はまったく違うはずです!私は、** 'x 'が定義されているかどうかは問題ではないことを説明しようとしていました。私はそれが重要ではないと言っていませんでした**あなたが持っているものはいくつですか? –