如何从指向多态基类的指针复制/创建派生类实例?

时间:2011-04-20 13:37:24

标签: c++ class copy instance polymorphism

我长期以来一直在努力解决这类问题,所以我决定在这里问一下。

class Base {
  virtual ~Base();
};
class Derived1 : public Base { ... };
class Derived2 : public Base { ... };
...

// Copies the instance of derived class pointed by the *base pointer
Base* CreateCopy(Base* base);

该方法应返回动态创建的副本,或者至少将对象存储在某些数据结构中,以避免“返回临时地址”问题。

实现上述方法的天真方法是在一系列if语句中使用多个typeiddynamic_cast来检查每种可能的派生类型,然后使用{{1}运算符。 还有其他更好的方法吗?

P.S。:我知道,使用智能指针可以避免这个问题,但我对简约方法感兴趣,没有一堆库。

2 个答案:

答案 0 :(得分:38)

您在基类中添加virtual Base* clone() const = 0;并在Derived类中正确实现它。如果你的Base不是抽象的,你当然可以调用它的拷贝构造函数,但这有点危险:如果你忘了在派生类中实现它,你将得到(可能不需要)切片。

如果您不想复制该代码,可以使用CRTP idiom通过模板实现该功能:

template <class Derived>
class DerivationHelper : public Base
{
public:
  virtual Base* clone() const
  {
    return new Derived(static_cast<const Derived&>(*this)); // call the copy ctor.
  }
};

class Derived1 : public DerivationHelper <Derived1> { ... };
class Derived2 : public DerivationHelper <Derived2> { ... };

答案 1 :(得分:1)

另一种方法是在公共基础中使用纯虚拟CreateCopy()方法,该方法在每个派生类中实现。