用于保存子对象的父类对象的动态数组

Posted

技术标签:

【中文标题】用于保存子对象的父类对象的动态数组【英文标题】:Dynamic array of objects of parent class to hold child objects 【发布时间】:2015-11-06 07:08:41 【问题描述】:

我有一个Mammal 父类。 DogCatLion 是子类。

我正在使用向量将所有子类保存为Mammal 对象

vector<Mammal> v;

并使用这一行将新对象附加到向量。

v.push_back(new Dog(Name, Blue, Owner));

显然它不起作用。 Error no instance of overload function 在编译期间被抛出给我。我是 C++ 新手,所以我不确定动态创建父类数组以保存所有子对象的正确方法是什么

【问题讨论】:

首先你应该阅读object slicing。其次,使用new 会产生一个指针,并且你有一个对象向量而不是指针向量。第三,在发布有关构建错误的问题时,请在问题中包含完整且未经编辑的错误输出。 与上一个问题相同:only 具有指针或引用的多态性。 【参考方案1】:

buchipper 已经给了你很好的建议。如果您想正确管理宠物的生命周期,请考虑使用std::unique_ptr&lt;&gt;std::shared_ptr&lt;&gt; 而不是原始指针:

// the vector owns the pets and kills them, when they are removed
// from the vector
vector<std::unique_ptr<Mamal> > v1

// the vector has shared ownership of the pets. It only kills them,
// when noone else needs them any more
vector<std::shared_ptr<Mamal> > v2

// the vector has no ownership of the pets. It never kills them.
vector<Mamal*> v3

在最后一种情况下,其他人必须照顾宠物的死亡,否则它们会像僵尸一样在你的记忆中徘徊。你不想这样对你的宠物,是吗?

更新 哦,我忘了提,你应该更喜欢make_shared()make_unique() 而不是新的,或者使用emplace_back() 而不是push_back()

v1.emplace_back(new DogName, Blue, Owner);
v1.push_back(make_unique<Dog>(Name, Blue, Owner))

v2.emplace_back(new DogName, Blue, Owner);
v2.push_back(make_shared<Dog>(Name, Blue, Owner))

【讨论】:

【参考方案2】:

正如 cmets 中已经提到的,您有一个哺乳动物对象的向量,而不是指针或引用。

试试 -

vector <Mammal *> v;
v.push_back(new Dog(Name, Blue, Owner));

【讨论】:

以上是关于用于保存子对象的父类对象的动态数组的主要内容,如果未能解决你的问题,请参考以下文章

如何将对象的动态数组保存在单个数组中

java中数组对象直接父类是啥?

如何使用动态索引更新对象数组?

如何使用 Jackson 将 JSON 键值数组动态映射到子对象?

js数组对象的父数据对象-子数组对象,(数组对象相减)

冒泡排序不适用于对 C++ 中的动态对象数组进行排序