首頁 > 後端開發 > C++ > 主體

如何在 C 中從基底類別指標建立衍生類別實例的副本?

Patricia Arquette
發布: 2024-10-26 04:55:31
原創
358 人瀏覽過

How to Create Copies of Derived Class Instances from Base Class Pointers in C  ?

多態:從基類指標建立衍生類別實例的副本

在物件導向程式設計中,常常會遇到需要的場景建立衍生類別實例的副本,同時透過指向其多型基類別的指標來存取它們。這項任務可能具有挑戰性,特別是在避免使用外部程式庫或複雜的程式碼結構時。

問題:

考慮以下類別層次結構:

<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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!