当我制作父类的向量时,如果我把一个孩子放在那里,孩子的成员会丢失吗? [复制]
Posted
技术标签:
【中文标题】当我制作父类的向量时,如果我把一个孩子放在那里,孩子的成员会丢失吗? [复制]【英文标题】:When I make a vector of a parent class, if I put a child there, child's members will be lost? [duplicate] 【发布时间】:2014-05-14 18:45:59 【问题描述】:(对不起,如果以前在这里问过这个问题,但是我现在搜索了几个小时,但没有找到任何东西。有人说我想要什么是可能的,他告诉我怎么做,我照他说的做了这是彻底的失败。)
首先,这是一个类图,以便于提出问题。
然后是不符合我要求的代码:
int main()
Employee jack("Jack", 100);
People guys(jack); // using push_back
...
所以当这种情况发生时,如调试模式所示,guy[0] 将只有name
,没有salary
。 向量中的对象是否有可能拥有除name
之外的其他成员? 或者我唯一的选择是创建一个Employee
向量?
编辑:顺便说一句,Person
是虚拟的。
【问题讨论】:
【参考方案1】:向量必须是vector<Person*>
类型(或者更好的是,智能指针类型之一,如shared_ptr
或unique_ptr
)才能执行此操作。否则,Employee
在添加时将被分割成Person
,如您所见。
莫斯科answer 的弗拉德解释了为什么会这样。
【讨论】:
谢谢,这条信息为我节省了很多时间,并使我的程序更加优雅。再次感谢您。 如果这对您来说很明显,我深表歉意,但如果您要切换到指针,请确保某些东西使指向的对象保持活动状态,否则您最终会遇到更大的问题。 是的,当然,这不是问题。现在我坚持需要获取向量中元素的类型。所以要找到可以返回 char* "Employee" 的东西。 这是另一个主题,但您可以使用dynamic_cast
。但更好的是设计所以没有必要。这是另一个讨论该主题的问题的链接:***.com/q/23569140/3549027
实际上我必须得到一些东西来保存到文件中,但我想我只是创建了一个 char* Employee::getType()
方法。还是谢谢你。【参考方案2】:
多态性适用于基类的指针和引用。您可以不定义引用向量,但可以定义指向基类的指针向量。
相对于您的示例向量,人应该被定义为
std::vector<Person *> people;
【讨论】:
以上是关于当我制作父类的向量时,如果我把一个孩子放在那里,孩子的成员会丢失吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章