我遇到了复制构造函数的问题...我想对此有一个基本的答案,而我却错过了一些明显的事情-也许我做的事情完全错了-但我一直无法弄清楚。
基本上,我有一个父班和一个子班。父类包含一个指向(不同)基类对象的指针向量。子类希望改为存储指向从该基础对象派生的对象的指针。
这是一个伪代码示例,如果有帮助的话:
// Base classes
class ItemRev {
...
}
class Item {
protected:
vector<ItemRev *> m_revPtrVec;
}
Item::Item(const Item &inputItemObj)
{
// Copy contents of the input object's item rev pointer vector
vector<ItemRev *>::const_iterator vecIter = (inputItemObj.m_revPtrVec).begin();
while (vecIter != (inputItemObj.m_revPtrVec).end()) {
(this->m_revPtrVec).push_back(new ItemRev(**vecIter));
}
}
=========
// Derived classes
class JDI_ItemRev : public ItemRev {
...
}
class JDI_Item : public Item {
...
}
JDI_Item::JDI_Item(const JDI_Item &itemObj)
{
// Copy contents of the input object's item rev pointer vector
vector<ItemRev *>::const_iterator vecIter = (inputItemObj.m_revObjPtVec).begin();
// The below does not work!
while (vecIter != (inputItemObj.m_revObjPtVec).end()) {
m_revObjPtVec.push_back(new JDI_ItemRev(**vecIter));
}
}
上面的问题push_back()
在于JDI_Item
复制构造函数中的调用。
有了这个设置,子类的副本构造函数应该是什么样的?我什至需要一个子类副本构造函数吗?我以为是这样,因为复制构造函数正在创建新对象,而父复制构造函数将创建不是我想要的派生类类型的新对象(即,父对象存储指向对象的指针ItemRev
,而子对象应该存储指向对象的指针)存储指向派生JDI_ItemRev
对象的指针)。
正如评论中提到的那样,表达这个问题的方式可能更简洁(即,您的类结构需要做一些工作)。
但是,如果要这样做,最简单的方法是在的基类中使用虚拟clone()方法ItemRev
,并在派生类中定义其覆盖。
例如:
class ItemRev {
virtual ItemRev* clone() const = 0;
};
class JDI_ItemRev : public ItemRev {
ItemRev* clone() const override
{
// do your actual cloning here, using the copy constructor
return new ItemRev(*this);
}
};
现在,无论何时调用clone()
派生自的任何类ItemRev
,都将返回,ItemRev*
但它将指向完全构造的派生类。您当然可以使用static_cast<>
或到达派生类的接口dynamic_cast<>
。
...然而...
推导通常看起来很容易,但事实却并非如此。仅当派生类确实是基类的一种类型时,才应使用继承。当派生类非常类似于基类,或者与基类具有许多特征时,人们通常会选择继承。现在不是使用继承的时候。现在是时候使用封装了。
通常,继承是邪恶的。
另一方面,您可能会发现此链接很有趣。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句