C++中如何将子类B/C的联合体存入std::vector<A*>?
问题分析与解决办法
你的代码报错核心是类型不兼容:std::vector<A*> 只能存储指向A或其子类的指针,但你直接传入的是联合体D的对象或D的指针,而D和A没有任何继承或隐式转换关系,编译器自然会报错。
错误点拆解
v.push_back(D()):这里传入的是一个D类型的临时对象,不是指针,更不是A*类型,完全不匹配。v.push_back(new D()):new D()返回的是D*,但D并非A的子类,无法隐式转换为A*,类型不兼容。
可行解决办法
你的需求本质是用联合体D来存储B*或C*,再将这些子类指针存入vector<A*>。正确的做法是从联合体中取出实际的B*或C*指针,再存入vector(因为B*和C*可以隐式转换为A*)。
修改后的示例代码:
#include <vector> struct A {}; struct B : public A {}; struct C : public A {}; union D { B* b; C* c; }; int main(int argc, char** argv) { std::vector<A*> v; // 存入B* D d_b; d_b.b = new B(); // 初始化联合体的b成员 v.push_back(d_b.b); // 取出B*,隐式转成A*存入 // 存入C* D d_c; d_c.c = new C(); // 初始化联合体的c成员 v.push_back(d_c.c); // 取出C*,隐式转成A*存入 // 清理内存,避免泄漏 for (auto ptr : v) { delete ptr; } return 0; }
注意事项
- C++中的联合体默认未初始化,使用时必须明确初始化其中一个成员(比如上面的
d_b.b = new B()),否则会触发未定义行为。 - 如果你的场景需要跟踪联合体中当前存储的是
B*还是C*,建议给联合体加一个标签字段(比如枚举类型),避免后续操作时误取错误的成员。
内容的提问来源于stack exchange,提问作者ERSUCC
相关产品推荐
相关产品推荐

