2012-03-06 4 views
2

複数の継承レベルのデータメンバーがC++コンパイラで連続して割り当てられるかどうかは疑問です。たとえば、私は以下のクラスを持っている場合:実装継承では、連続して割り当てられた複数のレイヤのデータメンバーですか?

class Base 
{ 
public: 
    int a; 
}; 

class child_1 : public Base 
{ 
public: 
    int b; 
}; 

class child_2 : public child_1 
{ 
public: 
    int c; 
} 

するすべてのコンパイラに期待されているどのような操作の実行と出力は次のうちどれですか?これが可能であるならば、私は上に持っているか、以下もpermissableになるよう

child_2 my_obj; 

my_obj.a = 3; my_obj.b = 2; my_obj.c = 1; 

Base* base_ptr = (Base*)&my_obj; 
int* int_ptr = (int*)base_ptr; 

cout << "Output 3: " << *int_ptr << endl 
    << "Output 2: " << *(int_ptr + 1) << endl; 
    << "Output 1: " << *(int_ptr + 2) << endl; 

はさらに、私は、Base *型にchild_2 *タイプから中間のキャストが必要なのでしょうか?

int* int_ptr (int*)&my_obj; 

これはいい考えですか?明らかに、あなたはこのようなことをしないようにソフトウェアを設計したいと思っていますが、古いコード(経験豊富なソフトウェアエンジニアによって作られた問題を解決するためのアプローチを検討しています。より複雑)。

私は、具体的に働いているコンパイラはVC++ 2005

+0

'virtual'関数を導入したことがあると、これは壊れます。別のデータメンバーを導入した場合、これは壊れます。 ...正直言って、カプセル化は目的のために作られたものです。本当に反復が必要な場合は、関数に、あなたが望む順序でさまざまなフィールドを参照する 'int *'の配列を作成してください。 –

答えて

3

ではありません、派生クラスのメンバーとベースクラスのメンバーの相対的なレイアウトが指定されていません。現在の標準で

、クラスは他の条件のうち、場合のみ標準レイアウトであり、それは:

ないか、非静的データ最も派生クラスのメンバと最大1個の塩基を有していません非静的データメンバと非静的データメンバを持つクラス、またはまったく基底クラスを持っていない(あなたのコンパイラに適用されます)古い規格で

標準レイアウトの概念さえありませんでした、PODのみ、および空でない基底クラスはPODではありませんでした。

あなたのコードは、特定のコンパイラがどのように基本クラスをレイアウトするかに依存し、移植性がありません。

関連する問題