可能重复:
Can a pointer to base point to an array of derived objects?
我正在练习所学的知识,并尝试了以下内容:
#include <iostream>
struct S {
S() : val(0) {}
int val;
};
struct D : S {
D() : val(1) {}
int val;
};
void f(S *s) {
for (int i = 0; i < 5; i++, s++)
std::cout << s->val;
}
int main() {
D d[5];
f(d);
}
我觉得奇怪的是输出是01010
而不是11111
,就像我预期的那样。所以它似乎是从val
类中获取S
成员而不是在每个其他循环上获得D
类。但为什么呢?
答案 0 :(得分:6)
由于s++
使指针增加sizeof(S)
,而不是sizeof(D)
,但s
实际上在运行时指向D
数组。 / p>
S::val
对齐(为0),D::val
(即1),S::val
(为0)这实际上是一种未定义的行为。如果您的课程看起来不同(或者使用了具有不同对齐方式的平台),您将收到不同甚至更令人困惑的结果。
如果您不需要多态,只需声明该函数以接收D
(不是S
)的数组。如果确实需要多态性,则应考虑使用(智能)指针数组,而不是具体元素数组(并通过虚函数而不是直接字段访问来访问数据)。