」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何從多型基底類別指標建立衍生類別實例的副本:使用虛擬複製方法和 CRTP 的解決方案

如何從多型基底類別指標建立衍生類別實例的副本:使用虛擬複製方法和 CRTP 的解決方案

發佈於2024-11-07
瀏覽:741

How to Create Copies of Derived Class Instances from Polymorphic Base Class Pointers: A Solution Using Virtual Clone Methods and CRTP

從多型基類指針複製衍生類別實例

對許多人來說,這個程式設計難題已被證明難以捉摸。讓我們探討一下所涉及的複雜性並找到一個有效的解決方案。

考慮以下場景:您有類別 Base、Derived1、Derived2 等,其中 Derived 類別繼承自 Base。給定一個指向 Base 物件的指針,目標是建立底層 Derived 物件的動態分配副本,避免諸如「返回臨時物件的位址」之類的問題。

傳統上,這是透過冗長的內容來解決的條件語句中的 typeids 或dynamic_casts。不過,我們尋求更優雅的解決方案。

虛擬複製方法

關鍵在於在Base類別中引入一個虛擬clone()方法,為每個Derived實作類型。此方法傳回物件的副本。如果 Base 不是抽象的,您可以呼叫其複製建構函數,但如果在衍生類別中未正確實現,這種方法會帶來切片的風險。

代碼重用的 CRTP 習慣用法

為了避免代碼重複,可以採用 CRTP(奇怪的重複模板模式)習慣用法。考慮以下通用模板:

template 
class 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