多态:从基类指针创建派生类实例的副本
在面向对象编程中,经常会遇到需要的场景创建派生类实例的副本,同时通过指向其多态基类的指针访问它们。这项任务可能具有挑战性,特别是在避免使用外部库或复杂的代码结构时。
问题:
考虑以下类层次结构:
<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中文网其他相关文章!