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