与多态性一起使用的数组的奇怪输出
Weird output for array used with polymorphism
可能的重复项:
指向基的指针可以指向派生对象数组吗?
我正在练习所学的知识,并尝试了以下方法:
#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
。因此,它似乎从S
类中获取val
成员,而不是每隔一个循环中的D
类。但是为什么?
因为s++
指针递增sizeof(S)
,而不是sizeof(D)
,但s
实际上在运行时指向D
数组。
- 第一次迭代恰好与第一个数组元素的
S::val
对齐(为 0), - 第二个元素
D::val
第一个元素(即 1), - 第三个元素的
S::val
(为 0) - 等等...
这本质上是一种未定义的行为。如果您的类看起来不同(或者使用了具有不同对齐方式的平台),您将收到不同的甚至更令人困惑的结果。
如果不需要多态性,只需声明函数以接收D
数组(不是S
)。如果你确实需要多态性,你应该考虑使用一个(智能)指针数组,而不是具体元素数组(并通过虚函数而不是直接字段访问来访问数据)。
相关文章:
- 将值从二维数组输出到文本文件
- 为什么我的数组输出一个不在其中的元素
- 长度为 20 的 Cout'ing 数组输出 23 个字符
- 将矢量数组输出到 tex 文件中,错误
- 来自不同位置的数组输出的执行时间
- 数组输出中缺少字符
- 字符数组输出 - C++
- C 合并的数组输出错误
- 制作垫子类型对象的数组.输出窗口显示同一帧
- C++数组输出地址
- 字符数组输出正确,但实际上没有存储正确的值
- 字符串数组输出
- 为什么在将字符数组输出到控制台时会得到垃圾值
- 字符数组输出额外的字符
- 从字符数组输出到控制台
- 为什么计数从字符数组输出错误的字符
- 动态初始化的 2D 数组输出错误
- C++指针和2d数组输出
- c++中奇怪的char数组输出
- 类函数中的c++字符数组输出