從多態基底類別指標建立衍生類別實例
在物件導向程式設計中,常常需要複製或建立衍生類別的實例從指標到多態性基底類別的類別。然而,當存在多個派生類型時,此操作可能具有挑戰性。
在 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中文網其他相關文章!