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

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

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

最佳答案

您在基类中添加 virtual Base* clone() const = 0; 并在派生类中适本地实现它。如果你的 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> { ... };

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

相关文章:

c++ - 处理 C++ 中不明确的声明

java - 无法理解类在 Scala 中的工作原理

perl - 使用perl将内容从一个文件复制到另一个文件

java - 如何计算具有3个坐标点的类的两个对象之间的距离?

sql - 用于压缩和传输数据库备份文件的示例 sql 脚本

javascript - 在 bootstrap 3 中复制到剪贴板

c++ - C++ 编译器如何创建对象?

c++ - 类在内存中是否比它们在 C++ 中的成员大?

C++:sqlite3 是否使用 errno 代码?

java - 如何将方法从不同的类传递到 Java 中的另一个类?