Przypisywanie tablicy klasy pochodnej do wskaźnika klasy bazowej
#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;
}
Problem jest w linii 2 funkcji głównej. Spodziewałem się, że gdy funkcja sum1 () zostanie wywołana z argumentem arrD (który jest tablicą pochodnych obiektów klas), po prostu „odetnie” D :: d, ale w tym przypadku zmienia porządek w arrD, i sumowanie przebiega następująco: 10 + 11 + 11 + 12 + 12 + 13 + 13 + 14 + 14 + 15 Wydaje się, że na przemian występują pola b i d arrD [i], i powinno być sumowanie tylko pól b . Czy ktoś może wyjaśnić dlaczego? Z góry dziękuję.