从多态基类指针复制派生类实例
对于许多人来说,这个编程难题已被证明难以捉摸。让我们探讨一下所涉及的复杂性并找到一个有效的解决方案。
考虑以下场景:您有类 Base、Derived1、Derived2 等,其中 Derived 类继承自 Base。给定一个指向 Base 对象的指针,目标是创建底层 Derived 对象的动态分配副本,避免诸如“返回临时对象的地址”之类的问题。
传统上,这是通过冗长的内容来解决的条件语句中的 typeids 或dynamic_casts。不过,我们寻求更优雅的解决方案。
虚拟克隆方法
关键在于在Base类中引入一个虚拟clone()方法,为每个Derived实现类型。此方法返回对象的副本。如果 Base 不是抽象的,您可以调用其复制构造函数,但如果在派生类中未正确实现,这种方法会带来切片的风险。
代码重用的 CRTP 习惯用法
为了避免代码重复,可以采用 CRTP(奇怪的重复模板模式)习惯用法。考虑以下通用模板:
templateclass DerivationHelper : public Base { public: virtual Base* clone() const { return new Derived(static_cast (*this)); } };
通过使用此模板,多个 Derived 类可以继承自 DerivationHelper,并使用各自的复制构造函数实现 Clone() 方法。
实现和优点
这个解决方案有几个好处:
通过采用 virtualclone() 方法和 CRTP 习惯用法,程序员可以有效地实现所需的功能,而不需要复杂的或容易出错的方法。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3