当我制作父类的向量时,如果我把一个孩子放在那里,孩子的成员会丢失吗? [复制]

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_ptrunique_ptr)才能执行此操作。否则,Employee 在添加时将被分割成Person,如您所见。

莫斯科answer 的弗拉德解释了为什么会这样。

【讨论】:

谢谢,这条信息为我节省了很多时间,并使我的程序更加优雅。再次感谢您。 如果这对您来说很明显,我深表歉意,但如果您要切换到指针,请确保某些东西使指向的对象保持活动状态,否则您最终会遇到更大的问题。 是的,当然,这不是问题。现在我坚持需要获取向量中元素的类型。所以要找到可以返回 char* "Employee" 的东西。 这是另一个主题,但您可以使用dynamic_cast。但更好的是设计所以没有必要。这是另一个讨论该主题的问题的链接:***.com/q/23569140/3549027 实际上我必须得到一些东西来保存到文件中,但我想我只是创建了一个 char* Employee::getType() 方法。还是谢谢你。【参考方案2】:

多态性适用于基类的指针和引用。您可以不定义引用向量,但可以定义指向基类的指针向量。

相对于您的示例向量,人应该被定义为

std::vector<Person *> people;

【讨论】:

以上是关于当我制作父类的向量时,如果我把一个孩子放在那里,孩子的成员会丢失吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的子类没有继承父类的所有方法?

小孩子数学漫游指南

8- 类

孩子不跟随父母

写 给 我 的 孩 子

为啥我会收到此错误? “孩子未申报?