多態:從基類指標建立衍生類別實例的副本
在物件導向程式設計中,常常會遇到需要的場景建立衍生類別實例的副本,同時透過指向其多型基類別的指標來存取它們。這項任務可能具有挑戰性,特別是在避免使用外部程式庫或複雜的程式碼結構時。
問題:
考慮以下類別層次結構:
<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中文網其他相關文章!