首页  >  文章  >  后端开发  >  如何在 C 中从基类指针创建派生类实例的副本?

如何在 C 中从基类指针创建派生类实例的副本?

Patricia Arquette
Patricia Arquette原创
2024-10-26 04:55:31359浏览

How to Create Copies of Derived Class Instances from Base Class Pointers in C  ?

多态:从基类指针创建派生类实例的副本

在面向对象编程中,经常会遇到需要的场景创建派生类实例的副本,同时通过指向其多态基类的指针访问它们。这项任务可能具有挑战性,特别是在避免使用外部库或复杂的代码结构时。

问题:

考虑以下类层次结构:

<code class="cpp">class Base {
  virtual ~Base();
};
class Derived1 : public Base { ... };
class Derived2 : public Base { ... };</code>

目标是创建一个方法 CreateCopy(Base* base),该方法返回 base 指向的实例的动态创建副本。避免返回对临时对象的引用以防止运行时错误至关重要。

幼稚的方法:

幼稚的方法涉及在一个一系列 if 语句来确定特定的派生类类型,然后利用 new 运算符创建副本。不过这种方法比较麻烦,而且容易出错。

更好的方法:

更优雅、更通用的解决方案是在基类中引入一个虚方法:

<code class="cpp">class Base {
  virtual ~Base();
  virtual Base* clone() const = 0;
};</code>

每个派生类都会实现自己的clone()方法来创建实例的副本。

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)); // call the copy ctor.
  }
};</code>

现在,派生类可以从 DerivationHelper 继承,而不是直接从 Base 继承:

<code class="cpp">class Derived1 : public DerivationHelper<Derived1> { ... };
class Derived2 : public DerivationHelper<Derived2> { ... };</code>

这种方法确保所有派生类都可以访问clone()方法,而不需要在每个类中手动实现。

以上是如何在 C 中从基类指针创建派生类实例的副本?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn