父/子类的C ++复制构造函数问题

脆皮

我遇到了复制构造函数的问题...我想对此有一个基本的答案,而我却错过了一些明显的事情-也许我做的事情完全错了-但我一直无法弄清楚。

基本上,我有一个父班和一个子班。父类包含一个指向(不同)基类对象的指针向量。子类希望改为存储指向从该基础对象派生的对象的指针。

这是一个伪代码示例,如果有帮助的话:

// 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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

父/子类的C ++复制构造函数问题

来自分类Dev

Java超类变量和子类复制构造函数问题

来自分类Dev

C ++子类构造函数

来自分类Dev

C ++中的复制构造函数

来自分类Dev

C ++中的复制构造函数

来自分类Dev

C ++调用默认构造函数而不是复制构造函数

来自分类Dev

C ++中的构造函数和复制构造函数行为

来自分类Dev

没有默认构造函数的奇怪的C ++复制构造函数

来自分类Dev

C ++复制构造函数和默认构造函数

来自分类Dev

BigInt C ++和适当的复制构造函数?

来自分类Dev

尽管不使用C ++复制构造函数

来自分类Dev

C ++显式复制构造函数?

来自分类Dev

带指针的C ++复制构造函数

来自分类Dev

C ++复制构造函数错误

来自分类Dev

C ++:迭代器的复制构造函数

来自分类Dev

模拟复制构造函数的C ++类

来自分类Dev

在C ++中返回时复制构造函数

来自分类Dev

深入复制链表的C ++构造函数

来自分类Dev

复制C#中的多态构造函数

来自分类Dev

C ++复制构造函数被多次调用

来自分类Dev

链表C ++中的复制构造函数

来自分类Dev

调用父子构造函数

来自分类Dev

调用父子构造函数

来自分类Dev

如何在Swift子类中实现复制构造函数?

来自分类Dev

C ++成员在父子构造函数之间更改值

来自分类Dev

C#结构上的复制构造函数,类似于C ++复制构造函数

来自分类Dev

用基类的复制构造函数替换默认的复制构造函数(C ++)

来自分类Dev

在C ++中为链表创建复制构造函数/函数

来自分类Dev

c ++复制构造函数和析构函数