eol*_*old 26 c++ polymorphism copy class instance
我很长一段时间一直在努力解决这类问题,所以我决定在这里问一下.
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);
Run Code Online (Sandbox Code Playgroud)
该方法应返回动态创建的副本,或者至少将对象存储在某些数据结构中的堆栈上以避免"返回临时地址"问题.
实现上述方法的天真方法是在一系列if语句中使用多个typeid
s或dynamic_cast
s来检查每个可能的派生类型,然后使用new
运算符.还有其他更好的方法吗?
PS:我知道,使用智能指针可以避免这个问题,但我对简约方法感兴趣,没有一堆库.
ltj*_*jax 39
您可以virtual Base* clone() const = 0;
在基类中添加一个并在Derived类中适当地实现它.如果你Base
不是抽象的,你当然可以调用它的拷贝构造函数,但这有点危险:如果你忘了在派生类中实现它,你将得到(可能不需要的)切片.
如果您不想复制该代码,可以使用CRTP惯用法通过模板实现该功能:
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> { ... };
Run Code Online (Sandbox Code Playgroud)