C ++代码的解释

时间:2013-08-14 09:50:52

标签: c++ class object pointers inheritance

代码:

#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

我无法理解为什么第二行输出是01010.这个程序仅用于学习目的,在Turbo C ++中实现。

1 个答案:

答案 0 :(得分:4)

SomeFunc期待一个base数组。在main中的第一次调用中,您传递的是base数组,但在第二次调用中,您传递的是deri数组。 deri个对象大于base个对象,因此在arr++ SomeFunc之后,您的指针arr将不再指向base个对象

基地的内存布局是:[int bval]
deri的内存布局是:[base,int dval]

DeriArr是[deri 0,deri 1,deri 2,derived 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不会推进一个dval对象(一个int bval和一个int dval)的指针,而只是一个基础对象(仅一个int bval)。正如你所看到的那样,++ arr arr将指向[int dval 0,...]。