指向基类map的指针是否合法?C++多类型map遍历疑问
结论:你的代码属于C++标准中的未定义行为,不合法
map<int, Derived>和map<int, Base>是完全独立的两种类型,C++标准禁止将一种容器类型的指针强制转换为另一种无关容器类型的指针——哪怕它们的元素类型存在继承关系,这也不属于合法的类型转换场景。- 你测试时程序能运行只是巧合:虽然
Derived是POD且第一个继承Base,但map容器的内部布局(比如节点结构、分配器相关成员、元素存储的细节等)会随元素类型变化而不同。强制转换后遍历的行为完全不可预测,换编译器、版本或标准库实现,程序可能崩溃、输出乱码或出现其他异常。 - 符合标准的替代方案(无需使用指针类型map):写一个通用的遍历模板函数,封装重复逻辑:
之后直接调用template<typename Map> void traverseMap(const Map& map) { for (const auto& [key, val] : map) { std::cout << '\n' << key << " " << val.a; } }traverseMap(mapOfDerived)和traverseMap(mapOfBase)即可,既安全又满足需求。
内容的提问来源于stack exchange,提问作者mr_guy99493
相关产品推荐
相关产品推荐

