using namespace std;
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。
此題考查的是類的內存分佈。
對單個類來說是在內存中的分佈是先存放類的首地址,然後依次存放類的成員變量和成員函數,並滿足對齊原則。
如果是有繼承,則對基類來說是先存放基類的成員變量,然後再存放子類的成員變量,
void seta(A* data, int idx) {
data[idx].a = 2;
}
把data指針轉換成了A,變成了父類,然後類的內存分佈是依次先排父類的成員變量,再排子類的成員變量。
這裏基類只有一個成員變量a,但是內存中分佈是abababab,這樣子的,所以循環4次,依次進行4次賦值,所以輸出22221111.
如果是
void seta(B* data, int idx) { //
data[idx].a = 2;
}
如果這裏不進行類別轉換,仍然是子類的指針,那麼這時候會只對a成員變量進行賦值,不會對子類的b成員變量賦值,輸出就會變21212121.