1

コード:

#include<iostream.h>
class base
{
   public:
   int bval;
   base(){ bval=0;}
};

class deri:public base
{
   public:
   int dval;
   deri() { dval=1; }
};

void SomeFunc(base *arr,int size)
{
   for(int i=0; i<size; i++,arr++)
       cout<<arr->bval;
   cout<<endl;
}

int main()
{
   base BaseArr[5];
   SomeFunc(BaseArr,5);

   deri DeriArr[5];
   SomeFunc(DeriArr,5);

   return 0;
}

出力:

00000
01010

出力の 2 行目が 01010 である理由を理解できません。このプログラムは、Turbo C++ で実装された学習目的のためのものです。

4

1 に答える 1

4

SomeFuncの配列が必要baseです。main の最初の呼び出しでは の配列を渡していbaseますが、2 番目の呼び出しでは の配列を渡していますderideriオブジェクトはオブジェクトよりも大きいため、ポインターbaseの最初の後にはオブジェクトarr++を指しなくなります。SomeFuncarrbase

base のメモリ レイアウト: [int bval] deri
のメモリ レイアウト: [base, int dval]

DeriArr は [deri 0, deri 1, deri 2, deri 3, deri 4] なので、
[base 0, int dval 0, base 1, int dval 1, base 2, int dval 2, base 3, int dval 3, base 4, int dval 4]
または分解:
[int bval 0, int dval 0, int bval 1, int dval 1, int bval 2, int dval 2, int bval 3, int dval 3, int bval 4, int dval 4 ]

SomeFunc は、配列の先頭を指す arr で始まります。これは問題ありませんが、++arr は 1 つの dval オブジェクト (1 つの int bval と 1 つの int dval) のポインターを進めるのではなく、1 つの基本オブジェクト (1 つの int bval のみ) のポインターを進めます。++arr arr の後でわかるように、[int dval 0, ...] を指します。

于 2013-08-14T09:55:02.603 に答える