我有抽象类 Item 和一些子多态类的Item,如: Sword , Ax 等。
在c ++中是否可以执行以下操作:
Item* firstVariable = new Sword();
Item* secondVariable = new typeof(firstVariable);
当我这样做时,我得到一个错误,即Item是一个抽象类。 你知道如何解决这个问题吗?
答案 0 :(得分:2)
要解释Neil的评论,这里有基本的克隆习语或虚拟副本成语:
.map()
但是,我建议几乎不要使用class Item {
public:
virtual ~Item() = 0;
virtual Item* clone() const = 0;
protected:
Item(const Item&) = default;
Item(Item&&) = default;
Item& operator=(const Item&) = default;
Item& operator=(Item&&) = default;
};
Item::~Item() = default;
class Sword : public Item {
public:
virtual Item* clone() const override
{ return new Sword(*this); }
};
class Axe : public Item {
public:
virtual Item* clone() const override
{ return new Axe(*this); }
};
int main()
{
Item* firstVariable = new Sword();
Item* secondVariable = firstVariable->clone();
delete firstVariable;
delete secondVariable;
}
和new
,因为它们太容易犯错误,让你失去指针,加倍删除,内存泄漏,异常不友好的代码,以及等等。这是一个更安全的解决方案:
delete