Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用父类/子类复制C++构造函数_C++_Pointers_Constructor - Fatal编程技术网

用父类/子类复制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);
  }
};