搜尋

首頁  >  問答  >  主體

c++ 类的输出问题

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?

PHPzPHPz2803 天前550

全部回覆(3)我來回復

  • PHP中文网

    PHP中文网2017-04-17 12:06:47

    因為A的大小是B的一半,所以實際上在seta()裡的data[1].a就變成了main()中的data[0].b,這是C++記憶體排布的問題。
    不過實際上你這樣寫程式是把物件B賦給了物件A,而不是將指向物件B的指針賦給了指向物件A的指針,這種寫法本來就是錯的。

    回覆
    0
  • 高洛峰

    高洛峰2017-04-17 12:06:47

    如果出現了這樣的問題,可以先透過單步調試看看每一步執行的時候的情況,然後根單步調試時候的現象再自己去嘗試分析

    回覆
    0
  • 黄舟

    黄舟2017-04-17 12:06:47

    函數seta(A* data, int idx)中的data[idx].a = 2可以理解為*(long*)(data + idx*sizeof(A)) = 2;,所以你這樣寫是有問題的

    回覆
    0
  • 取消回覆