首页 > 后端开发 > C++ > 正文

如何从多态基类指针创建派生类实例?

DDD
发布: 2024-10-27 00:09:30
原创
516 人浏览过

 How to Create Derived Class Instances from Polymorphic Base Class Pointers?

从多态基类指针创建派生类实例

在面向对象编程中,经常需要复制或创建派生类的实例从指针到多态基类的类。然而,当存在多个派生类型时,此操作可能具有挑战性。

在 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!