函数打印奇怪的值.C++

Function printing strange values. C++

本文关键字:C++ 打印 函数      更新时间:2023-10-16

考虑这个例子:

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.但是它是如何通过 a[i].a 访问数据 b 的,因为我从未在输出中提到过 b。

问题是sizeof(A) != sizeof(B).

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

虽然BA,但B[]不是A[]


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

  1. print接受B*论点。
  2. 使print成为模板函数。
  3. 创建采用B*参数的重载print

选择哪一个取决于您,并取决于您的用例。


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

A数组在内存中如下所示:

+--------+--------+--------+--------+--------+--------+--------+-----+ |A[0].a |A[1].a |答[2].a |A[3].a |答[4].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 |答[2].a |A[3].a |答[4].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成员。

虽然你不能依赖这种行为,但输出的可能解释,

考虑一组B对象

a|b   |  a|b    
object1   object2

当您将其解释为A*

a     |    b    |   a 
object1    object2   object3

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