#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(Derived クラス オブジェクトの配列) で呼び出された場合、単に D::d を「切り取る」と予想していましたが、この場合は arrD の順序を再配置し、合計は次のようになります: 10+11+11+12+12+13+13+14+14+15 arrD[i] の b フィールドと d フィールドが交互になっているようで、b フィールドのみを合計する必要があります。 . 誰かが理由を説明してもらえますか? 前もって感謝します。