从多态基类指针创建派生类实例
在面向对象编程中,经常需要复制或创建派生类的实例从指针到多态基类的类。然而,当存在多个派生类型时,此操作可能具有挑战性。
在 if 语句中使用多个 typeid 或dynamic_cast 来检查每种类型然后使用 new 的简单方法效率低下且容易出错。更好的解决方案是在基类中使用虚拟方法来创建副本。
虚拟克隆()方法
通过定义一个虚拟克隆( ) 基类中的方法并在每个派生类中实现它,可以动态创建派生类实例的副本。 clone() 方法应返回指向新创建的副本的指针。
<code class="cpp">class Base { virtual ~Base(); // Returns a dynamically created copy of this object virtual Base* clone() const = 0; };</code>
<code class="cpp">class Derived1 : public Base { // Implements the clone() method for Derived1 virtual Base* clone() const { return new Derived1(*this); } };</code>
<code class="cpp">class Derived2 : public Base { // Implements the clone() method for Derived2 virtual Base* clone() const { return new Derived2(*this); } };</code>
使用此方法,您可以创建派生类实例的副本来自基类指针,如下所示:
<code class="cpp">Base* basePtr = new Derived1(); Base* copyPtr = basePtr->clone();</code>
CRTP 极简实现方式
避免重复实现 clone() 在每个派生类中的方法中,您可以使用好奇重复模板模式(CRTP)习惯用法:
<code class="cpp">template <class Derived> class DerivationHelper : public Base { public: virtual Base* clone() const { return new Derived(static_cast<const Derived&>(*this)); } };</code>
<code class="cpp">class Derived1 : public DerivationHelper<Derived1> { // Other members... };</code>
<code class="cpp">class Derived2 : public DerivationHelper<Derived2> { // Other members... };</code>此方法自动实现
clone() 方法在每个派生类中,同时确保为正确的类型调用复制构造函数。
以上是如何从多态基类指针创建派生类实例?的详细内容。更多信息请关注PHP中文网其他相关文章!