2011-01-29 25 views
5

この例のようないくつかのクラスがあるとします。継承メモリストレージを持つオブジェクト

class A { 
    int k, m; 
public: 
    A(int a, int b) { 
      k = a; 
      m = b; 
    } 
}; 

class B { 
    int k, m; 
public: 
    B() { 
      k = 2; 
      m = 3; 
    } 
}; 

class C : private A, private B { 
    int k, m; 
public: 
    C(int a, int b) : A(a, b) { 
      k = b; 
      m = a; 
    } 
}; 

ここで、クラスCオブジェクトでは、変数は特定の方法で格納されていますか?私はPODオブジェクトで何が起こるのか知っていますが、これはPODオブジェクトではありません。

答えて

2

は、C++標準言及:

基本クラスのサブオブジェクトは、最も派生オブジェクト(1.8)に配置される順序が指定されていません。だから、

、あなたの例ではCオブジェクトは、それぞれのタイプAとタイプBの基本クラスサブオブジェクトの基本クラスサブオブジェクトを持っていますが、Aベース部材は、Bベース部材の前または後に来るかどうかは不定です。

0

これは標準で必要かどうかわかりませんが、合理的な実装では、 A :: k、A :: m、B :: k、B :: m、C :: k、C :: m(おそらくハードウェアの要件に従って整列されます)。私が考えることができるこの知識における唯一の実用的な理由は、CへのポインタをBへのポインタにキャストすると、その値(アドレス)が異なることを理解する必要があるということです。キャスト(reinterpret_cast <>など)を使用しないでください。第10章、派生クラスの導入において

+0

これはおそらく多くの実装で当てはまりますが、保証はないと思います。 –

+0

@jdv、それはおそらく実装固有のものですが、他の実装方法は考えられません。しかし、答えにメモを追加する必要があります。 –

関連する問題