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;
}
请问输出为什么是22221111?
PHP中文网2017-04-17 12:06:47
因為A的大小是B的一半,所以實際上在seta()
裡的data[1].a
就變成了main()
中的data[0].b
,這是C++記憶體排布的問題。
不過實際上你這樣寫程式是把物件B賦給了物件A,而不是將指向物件B的指針賦給了指向物件A的指針,這種寫法本來就是錯的。
黄舟2017-04-17 12:06:47
函數seta(A* data, int idx)
中的data[idx].a = 2
可以理解為*(long*)(data + idx*sizeof(A)) = 2;
,所以你這樣寫是有問題的