gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:20:18 24 4
gpt4 key购买 nike

我遇到了复制构造函数的问题...我假设对此有一个基本的答案,但我遗漏了一些明显的东西——也许我做的事情完全错了——但我没能弄清楚。

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

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

// 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_Item 复制构造函数中的 push_back() 调用中。

鉴于此设置,子类的复制构造函数应该是什么样的?我什至需要一个子类复制构造函数吗?我假设我这样做了,因为复制构造函数正在创建新对象,而父复制构造函数将创建不是我在派生类中想要的类型的新对象(即,父对象存储指向 ItemRev 对象,而子对象应存储指向派生的 JDI_ItemRev 对象的指针)。

最佳答案

如评论中所述,可能有更简洁的方式来表达这个问题(即您的类结构需要一些工作)。

但是,如果你想这样做,最简单的实现方式是在ItemRev的基类中使用一个虚拟的clone()方法。 ,在派生类中定义了它的覆盖。

例如:

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<> 访问派生类的接口(interface)。或 dynamic_cast<> .

...然而...

推导通常看起来很容易取胜,但事实往往并非如此。仅当派生类真的是基类的类型时才应使用继承。当派生类很像基类,或者基类有许多共同特征时,人们通常会选择继承。现在不是使用继承的时候。是时候使用封装了。

总的来说,继承是邪恶的。

另一方面,您可能会发现此链接很有趣。

Presentation on inheritance as an implementation detail

关于父/子类的 C++ 复制构造函数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27326347/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com