用父类/子类复制C++构造函数
我遇到了一个复制构造函数的问题…我想这有一个基本的答案,我错过了一些明显的东西-也许我做了一些完全错误的事情-但我一直无法找到它 基本上,我有一个父类和子类。父类包含指向不同基类对象的指针向量。子类希望存储指向从该基对象派生的对象的指针 下面是一个伪代码示例,如果有帮助的话:用父类/子类复制C++构造函数,c++,pointers,constructor,C++,Pointers,Constructor,我遇到了一个复制构造函数的问题…我想这有一个基本的答案,我错过了一些明显的东西-也许我做了一些完全错误的事情-但我一直无法找到它 基本上,我有一个父类和子类。父类包含指向不同基类对象的指针向量。子类希望存储指向从该基对象派生的对象的指针 下面是一个伪代码示例,如果有帮助的话: // Base classes class ItemRev { ... } class Item { protected: vector<ItemRev *> m_revPtrVec; } It
// 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));
}
}
上述问题存在于JDI_项复制构造函数中的push_-back调用中
在这种设置下,子类的复制构造函数应该是什么样子?我甚至需要一个子类副本构造函数吗?我假设我这样做了,因为复制构造函数正在创建新对象,而父复制构造函数将创建新对象,这些对象不是我在派生类中想要的类型,即父对象存储指向ItemRev对象的指针,而子对象应该存储指向派生JDI_ItemRev对象的指针。如注释中所述,可能有一种更简洁的方式来表达这个问题,即您的类结构需要一些工作 但是,如果您想这样做,最简单的方法是在ItemRev的基类中使用虚拟克隆方法,并在派生类中定义对其的重写 e、 g: 现在,无论何时对从ItemRev派生的任何类调用clone,都将返回一个ItemRev*,但它将指向一个完全构造的派生类。当然,您可以使用静态\u cast或动态\u cast访问派生类的接口 ……然而 派生似乎很容易获胜,但事实往往并非如此。仅当派生类确实是基类的类型时,才应使用继承。通常,当派生类非常类似于基类,或者与基类共享许多特性时,人们会选择继承。现在不是使用继承的时候。现在是使用封装的时候了 一般来说,继承是邪恶的 另一方面,你可能会发现这个链接很有趣
您需要一个来自基本构造函数的副本,该副本具有签名JDI_Item::JDI_itemcont ItemRev&。默认情况下不会为您生成此构造函数,因为它很少有意义。如果抛出任何异常,它就会泄漏。为什么你有一个指向JDI_ItemRev的指针的std::vector?为什么它们不直接在向量中,或者至少由智能指针管理?在第一种情况下,隐式定义应该有效。同样的事情也可以说。
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);
}
};