搜索

首页  >  问答  >  正文

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 天前547

全部回复(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
  • 取消回复