2010-11-18 9 views
2

私は基本的な質問があります メモリレイアウトに関しては継承とどのように関連が異なるのですか?メモリレイアウトに関しては継承とどのように関連が異なるのですか

class BaseClass{ 
private int i; 
public void DoSomethinG(){} 
} 

class DerivedClass : BaseClass{ 
} 

class AssocClass { 
private BaseClass bClass = new BaseClass(); 
} 

プライベートメンバーへのアクセス制限以外に、私はDerivedClassとAssocClassの両方が同じであると信じています。 BaseClassの変数iのメモリは、DerivedClassとAssocClassのサイズが同じである必要があります。

私は私の前提に忠実か、何か些細なことを逃していますか?

よろしく、

うわあ

答えて

2

メモリレイアウトは、2つの間で異なります。 DerivedClassの場合、DerivedClassBaseClassの両方のデータが一緒に格納されます。 DerivedClassのインスタンスを持たず、暗黙のインスタンスBaseClassを持たせることはできません。

AssocClassには、BaseClassというインスタンスへの参照があります。これはnullなので、インスタンスがまったく存在しない可能性があります。インスタンスがある場合、それは別の場所に格納された別のオブジェクトです。例えば。ヒープの世代が異なる可能性があります。これは、インスタンスが個別にガベージコレクションされる可能性があることを意味します(もちろん、AssocClassのインスタンスはBaseClassのインスタンスを参照しません)。

+0

ブライアン、ありがとうございました。アソシエーションのインスタンスが別の世代にある可能性があります。 – JeeZ

+0

@ Jeez:世代が異なる可能性がありますが、例のコードはそうではありません。ガベージコレクションを通じてAssocClassのインスタンスを保持し、bClass参照に新しいオブジェクトを割り当てると、 'AssocClass'のインスタンスは' BaseClass'のインスタンスより古い世代になります。 –