考虑这个例子:
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。
答案 0 :(得分:5)
问题在于sizeof(A) != sizeof(B)
。
print
函数认为它有一个(基本上)A
个对象的数组。它对B
或其成员一无所知。
虽然B
是A
,但B[]
不是A[]
。
有三种自然方法可以解决您的问题:
print
获得B*
参数。print
成为模板功能。print
参数的B*
重载。选择哪一个取决于您的使用情况。
为什么您似乎从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..
。