從多型基類指針複製衍生類別實例
對許多人來說,這個程式設計難題已被證明難以捉摸。讓我們探討一下所涉及的複雜性並找到一個有效的解決方案。
考慮以下場景:您有類別 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