代码:
class B {
public:
B () : b(++bCounter) {}
int b;
static int bCounter;
};
int B::bCounter = 0;
class D : public B {
public:
D () : d(0) {}
int d;
};
const int N = 10;
B arrB[N];
D arrD[N];
int sum1 (B* arr) {
int s = 0;
for (int i=0; i<N; i++)
{
s+=arr[i].b;
}
return s;
}
int sum2 (D* arr) {
int s = 0;
for (int i=0; i<N; i++)
{
s+=arr[i].b+arr[i].d;
}
return s;
}
问题:
这些返回什么:
1) sum1(arrB)
=?
2) sum1(arrD)
=?
3) sum2(arrD)
=?
当我编译并运行这些时,我得到 55、65 和 155,但不知道为什么。我收集到在 arrB 中变量是 b=1,2,3,...,10,在 arrD 中 b=11,12,...,20,所以我会回答 sum1(arrB)=55 和sum1(arrD)=155 等于 11+12+..+20 和 sum2(arrD)=155,因为处处 d=0。
我做错了什么?
最佳答案
您正在进行对象切片。
您正在将一个 D*
数组传递给一个接受 B*
数组的函数。 D
最初大于 B
。
每次执行 s+=arr[i].b;
时,您都在将指针移动 B 的大小,而您需要移动它 按 D 的大小,因此每次迭代后指针不会向前移动一项。
[TheBPart|TheDPart][TheBPart|TheDPart][TheBPart|TheDPart]
^
|
iteration 0
[TheBPart|TheDPart][TheBPart|TheDPart][TheBPart|TheDPart]
^
|
iteration 1
[TheBPart|TheDPart][TheBPart|TheDPart][TheBPart|TheDPart]
^
|
iteration 2
[TheBPart|TheDPart][TheBPart|TheDPart][TheBPart|TheDPart]
^
|
iteration 3
在您的特定情况下发生的情况是,在每次奇数迭代之后,它指向 D
类对象的中间 中的某个位置。这只是因为 D
恰好是 B
的两倍大,否则行为会有所不同。
关于c++ - 类数组求和、索引和计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12259695/