从指向多态基类的指针创建派生类实例
尝试创建派生类实例的副本时会出现此问题从指向其多态基类的指针。简单的方法涉及大量类型检查和动态转换,检查每个潜在的派生类型并使用 new 运算符。不过,还有更完善的解决方案。
关键是在基类中合并一个虚方法 Base*clone() const = 0;。然后,每个派生类必须重写此方法以创建特定的克隆。例如:
<code class="cpp">class Base { virtual ~Base(); virtual Base* clone() const = 0; }; class Derived1 : public Base { virtual Base* clone() const override { return new Derived1(*this); } }; class Derived2 : public Base { virtual Base* clone() const override { return new Derived2(*this); } };</code>
通过在基指针上调用clone(),可以获得特定派生类的新实例。这种简化的方法消除了类型检查或动态转换的需要,提高了代码的清晰度和效率。
但是,如果您希望避免代码重复,请考虑利用 CRTP(奇怪的重复模板模式)习惯用法。模板类可以定义如下:
<code class="cpp">template <class Derived> class DerivationHelper : public Base { public: virtual Base* clone() const override { return new Derived(static_cast<const Derived&>(*this)); } }; class Derived1 : public DerivationHelper<Derived1> { ... }; class Derived2 : public DerivationHelper<Derived2> { ... };</code>
该模板类在被派生类继承时,为 Clone() 方法提供必要的实现,从而无需在每个派生类中单独重写.
以上是如何从多态基类指针创建派生类实例:克隆方法和 CRTP 习惯用法指南的详细内容。更多信息请关注PHP中文网其他相关文章!