我有基类Base
,派生自Derived1
,Derived2
和Derived3
。
我为其中一个派生类构建了一个实例,我将其存储为Base* a
。我现在需要制作一个我将存储为Base* b
的对象的深层副本。
据我所知,复制类的正常方法是使用复制构造函数并重载operator=
。但是,由于我不知道a
是Derived1
,Derived2
还是Derived3
,我想不出使用复制构造函数或{{1}的方法}}。我能想到干净利落地完成这项工作的唯一方法就是实现:
operator=
和派生类中的实现class Base
{
public:
virtual Base* Clone() = 0;
};
如下:
Clone
Java倾向于使用class Derivedn : public Base
{
public:
Base* Clone()
{
Derived1* ret = new Derived1;
copy all the data members
}
};
,有更多的C ++方法吗?
答案 0 :(得分:35)
这仍然是我们在C ++中为多态类做的事情,但如果为对象创建一个复制构造函数(可能是隐式或私有),则不需要执行成员的显式复制。
class Base
{
public:
virtual Base* Clone() = 0;
};
class Derivedn : public Base
{
public:
//This is OK, its called covariant return type.
Derivedn* Clone()
{
return new Derivedn(*this);
}
private:
Derivedn(const Derivedn) : ... {}
};
答案 1 :(得分:2)
template <class T>
Base* Clone (T derivedobj) {
T* derivedptr = new T(derivedobj);
Base* baseptr = dynamic_cast<Base*>(derivedptr);
if(baseptr != NULL) {
return baseptr;
}
// this will be reached if T is not derived from Base
delete derivedptr;
throw std::string("Invalid type given to Clone");
}
此函数对派生类的唯一要求是它们的复制构造函数是公共可访问的。