我已经为这种问题苦苦挣扎很长时间了,所以我决定在这里提问。

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,以检查每种可能的派生类型,然后使用new运算符。
还有其他更好的方法吗?

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

最佳答案

您可以在基类中添加virtual Base* clone() const = 0;,并在派生类中适当地实现它。如果Base不是抽象的,则当然可以调用它的copy-constructor,但这有点危险:如果忘记在派生类中实现它,则会得到(可能是不需要的)切片。

如果您不想重复该代码,则可以使用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> { ... };

关于c++ - 如何从指向多态基类的指针复制/创建派生类实例?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5731217/

10-12 23:51