首頁  >  文章  >  後端開發  >  如何在 C 中安全地將 `unique_ptr` 從基底類別向下轉換為衍生類別?

如何在 C 中安全地將 `unique_ptr` 從基底類別向下轉換為衍生類別?

Susan Sarandon
Susan Sarandon原創
2024-11-23 11:03:35745瀏覽

How to Safely Downcast a `unique_ptr` from Base to Derived in C  ?

如何將unique_ptr 從Base 向下轉換為Derived

在物件導向程式設計中,通常使用類別層次結構來表示實數-世界概念。在 C 中,這通常是使用繼承來完成的。繼承允許衍生類別繼承其基底類別的屬性和行為。

使用類別層次結構時的一個常見需求是將指向基底類別的指標轉換為指向衍生類別的指標。這個過程稱為向下轉型。

在唯一指標的上下文中,向下轉換可能有點棘手。這是因為唯一指標旨在防止懸空指標和其他記憶體問題。因此,您不能簡單地使用 static_cast 將 unique_ptr 轉換為其他類型。

相反,您必須使用以下方法之一:

1.靜態唯一指標轉換

當您確定唯一指標實際上包含指向派生類別的指標時,可以使用此方法。下列函數範本可用於執行靜態唯一指標轉換:

template<typename Derived, typename Base, typename Del>
std::unique_ptr<Derived, Del>
static_unique_ptr_cast(std::unique_ptr<Base, Del> &&p) {
  auto d = static_cast<Derived *>(p.release());
  return std::unique_ptr<Derived, Del>(d, std::move(p.get_deleter()));
}

2.動態唯一指標轉換

當您不確定唯一指標是否包含指向衍生類別的指標時,可以使用此方法。以下函數範本可用於執行動態唯一指標轉換:

template<typename Derived, typename Base, typename Del>
std::unique_ptr<Derived, Del>
dynamic_unique_ptr_cast(std::unique_ptr<Base, Del> &&p) {
  if (Derived *result = dynamic_cast<Derived *>(p.get())) {
    p.release();
    return std::unique_ptr<Derived, Del>(result, std::move(p.get_deleter()));
  }
  return std::unique_ptr<Derived, Del>(nullptr, p.get_deleter());
}

範例

下列程式碼示範如何使用靜態唯一指標轉換將unique_ptr 轉換為不同型別:

#include <memory>

class Base {
public:
  virtual ~Base() {}
};

class Derived : public Base {
public:
  ~Derived() {}
};

int main() {
  std::unique_ptr<Base> uptr = std::make_unique<Derived>();
  std::unique_ptr<Derived> dptr = static_unique_ptr_cast<Derived>(std::move(uptr));
  return 0;
}

在這個範例中,我們建立一個Base 的unique_ptr目的。然後,我們使用靜態唯一指標轉換將 unique_ptr 轉換為派生物件的 unique_ptr。這是可能的,因為我們知道 Base 物件的 unique_ptr 實際上包含指向 Derived 物件的指標。

以上是如何在 C 中安全地將 `unique_ptr` 從基底類別向下轉換為衍生類別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn