功能打印奇怪的值。 C ++

时间:2018-04-19 09:03:53

标签: c++ arrays inheritance alignment

考虑这个例子:

class A
{
public:
     int a;
public:
     A():a(1){};
};

class B:public A
{
public:
     int b;
public:
     B():b(2){};
};

void print(A* a)
{
     for(int i=0; i<10; ++i)
     {
          cout<<a[i].a<<" ";
     } 
}

int main()
{
     B b[10];
     print(b);
}

我的节目输出是:1 2 1 2 1 2 1 2 1 2 1 2. 但它如何通过[i] .a访问数据b,因为我从未在输出中提到过b。

2 个答案:

答案 0 :(得分:5)

问题在于sizeof(A) != sizeof(B)

print函数认为它有一个(基本上)A个对象的数组。它对B或其成员一无所知。

虽然BA,但B[] A[]

有三种自然方法可以解决您的问题:

  1. print获得B*参数。
  2. 使print成为模板功能。
  3. 创建一个带print参数的B*重载。
  4. 选择哪一个取决于您的使用情况。

    为什么您似乎从B打印值是因为内存布局。

    A数组在内存中看起来像这样:

    +--------+--------+--------+--------+--------+--------+--------+-----+
    | A[0].a | A[1].a | A[2].a | A[3].a | A[4].a | A[5].a | A[6].a | ... |
    +--------+--------+--------+--------+--------+--------+--------+-----+
    

    B的数组看起来像这样

    +--------+--------+--------+--------+--------+--------+--------+-----+
    | B[0].a | B[0].b | B[1].a | B[1].b | B[2].a | B[2].b | B[3].a | ... |
    +--------+--------+--------+--------+--------+--------+--------+-----+
    

    现在,如果我们将两个数组放在一起:

    +--------+--------+--------+--------+--------+--------+--------+-----+
    | A[0].a | A[1].a | A[2].a | A[3].a | A[4].a | A[5].a | A[6].a | ... |
    +--------+--------+--------+--------+--------+--------+--------+-----+
    | B[0].a | B[0].b | B[1].a | B[1].b | B[2].a | B[2].b | B[3].a | ... |
    +--------+--------+--------+--------+--------+--------+--------+-----+
    

    使用上面的“叠加层”,您很容易理解为什么您似乎正在从b类打印B成员。

答案 1 :(得分:1)

虽然您不能依赖此行为,但可能会对输出进行解释,

考虑B

的一系列对象
   a|b   |  a|b    
 object1   object2

当您将其解释为A*

     a     |    b    |   a 
  object1    object2   object3

因此,你得到1 2 1 2..