#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;
}
问题出现在主函数的第二行。我原本期望当使用参数arrD(一个Derived类对象数组)调用sum1()函数时,它会简单地“剪掉”D::d,但是在这种情况下,它重新排列了arrD中的顺序,并且求和如下: 10+11+11+12+12+13+13+14+14+15 看起来它在交替使用arrD[i]的b和d字段进行求和,而应该只对b字段求和。 能否有人解释一下为什么? 提前感谢您。