下面程序执行结果
class A{
public:
long a;
};
class B : public A {
public:
long b;
};
void seta(A* data, int idx) {
data[idx].a = 2;
}
int main(int argc, char *argv[]) {
B data[4];
for(int i=0; i<4; ++i){
data[i].a = 1;
data[i].b = 1;
seta(data, i);
}
for(int i=0; i<4; ++i){
std::cout << data[i].a << data[i].b;
}
return 0;
}
A 21212121
B 22221111


或者在程序里强行将data转成B*赋值: ((B*)data).a = 2,结果也是212121。
原理是:和指针的步长取决于指针指向变量类型的内存大小。
T* P;
P + 1(步长) => P + 1*sizeof(T)