從多態性基類指標複製派生類別實例
對許多人來說,這個程式設計難題已被證明是難以捉摸的。讓我們探索所涉及的複雜性並找到一個有效的解決方案。
考慮以下場景:您有類別 Base、Derived1、Derived2 等,其中 Derived 類別繼承自 Base。給定一個指向 Base 物件的指針,目標是建立底層 Derived 物件的動態分配副本,避免諸如「返回臨時物件的位址」之類的問題。
傳統上,這是透過冗長的內容來解決的條件語句中的 typeids 或dynamic_casts。不過,我們尋求更優雅的解決方案。
虛擬克隆方法
關鍵在於在Base類別中引入一個虛擬clone()方法,為每個Derived實作類型。此方法傳回物件的副本。如果 Base 不是抽象的,您可以呼叫它的複製建構函數,但如果在衍生類別中沒有正確實現,這種方法就會帶來切片的風險。
程式碼重複使用的 CRTP 習慣用法
為了避免程式碼重複,可以使用 CRTP(奇怪的重複模板模式)慣用法。考慮以下通用模板:
template <class Derived> class DerivationHelper : public Base { public: virtual Base* clone() const { return new Derived(static_cast<const Derived&>(*this)); } };
透過使用此模板,多個 Derived 類別可以繼承自 DerivationHelper 並使用各自的複製構造函數實作clone()方法。
實作與優點
這個解決方案有幾個好處:
透過擁抱 virtual clone() 方法和 CRTP 慣用法,程式設計師可以有效地實現所需的效果無需複雜或容易出錯的方法即可實現功能。
以上是如何從多型基底類別指標建立衍生類別實例的副本:使用虛擬複製方法和 CRTP 的解決方案的詳細內容。更多資訊請關注PHP中文網其他相關文章!