代码:
#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 ++中实现。
答案 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,...]。