#include <iostream>
class B {
public:
B () : b(bCounter++) {}
int b;
static int bCounter;
};
int B::bCounter = 0;
class D : public B {
public:
D () : d(bCounter) {}
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;
}
int main() {
std::cout << sum1(arrB) << std::endl;
std::cout << sum1(arrD) << std::endl;
std::cout << sum2(arrD) << std::endl;
return 0;
}
问题出在 main 函数的第 2 行。我希望当 sum1() 函数使用参数 arrD(它是派生类对象的数组)调用时,它会简单地“切断”D::d,但在这种情况下,它会重新排列 arrD 中的顺序,并且求和是这样的: 10+11+11+12+12+13+13+14+14+15 它似乎在 arrD[i] 的 b 和 d 字段之间交替,它应该只总结 b 字段. 有人可以解释为什么吗?提前致谢。