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

C++ 如何从指向多态基类的指针复制/创建派生类实例?,c++,class,copy,instance,polymorphism,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); 该方法应该返回一

我一直在与这种问题斗争很长时间,所以我决定在这里问

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语句中使用多个
typeid
s或
dynamic\u cast
s来检查每个可能的派生类型,然后使用
new
操作符。 还有其他更好的方法吗


注:我知道,使用智能指针可以避免这个问题,但我对最简单的方法感兴趣,它没有一堆库。

您添加了一个
虚拟基*clone()const=0并在派生类中适当地实现它。如果您的
Base
不是抽象的,您当然可以调用它的复制构造函数,但这有点危险:如果您忘记在派生类中实现它,您将得到(可能不需要的)切片

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

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> { ... };
模板
类派生帮助程序:公共基
{
公众:
虚拟基*克隆()常量
{
返回新的派生(static_cast(*this));//调用复制构造函数。
}
};
类Derived1:公共派生帮助程序{…};
Derived2类:公共派生帮助程序{…};

另一种选择是在每个派生类中实现的公共基中有一个纯虚拟的
CreateCopy()
方法。

这似乎与这个问题完全相同:。看到迈克尔·安德森的公认答案了吗?@Darhuuk:我不太确定复制品的SO政策是什么,但这个问题有点不同。这里的OP询问了解决这个问题的方法,而这个问题的OP问克隆是否是一个好的C++方法。这显然是相关的,只是不确定它是否是一个“精确的复制品”。@Itjax很公平,只是给出的答案或多或少都是OP想要的。虽然我猜你下面的答案更方便:)。@David Doria:是的,除了那个片段大量泄漏内存。