首頁 >後端開發 >C++ >C 中的「static_cast」和「dynamic_cast」有什麼不同?

C 中的「static_cast」和「dynamic_cast」有什麼不同?

Linda Hamilton
Linda Hamilton原創
2024-12-04 01:42:11375瀏覽

What's the Difference Between `static_cast` and `dynamic_cast` in C  ?

C 中的動態和靜態轉換

C 中的dynamic_cast 和static_cast 的概念可能會令人困惑,尤其是在處理多態類時。為了更好地理解這些概念,讓我們從高層次的角度考慮它們在 C 中的等價物。

static_cast

static_cast C 中的操作是安全的編譯時轉換。它確保目標類型和來源類型相關,從而防止資料損壞。如果類型不相關,則會發生編譯錯誤。

在下面的範例中,static_cast操作將指向基底類別的指標安全地轉換為指向衍生類別的指標:

class B {};
class D : public B {};
D* d = new D;
B* b = static_cast<B*>(d); // Safe compile-time cast

dynamic_cast

與static_cast 不同,dynamic_cast是一個運行時演員表。它在運行時檢查指標的實際類型是否與目標類型相符。它可以處理從基底類別到衍生類別 (B2D) 以及從衍生類別到基底類別 (D2B) 的轉換。

對於 D2B 轉換,dynamic_cast如果強制轉換無效,則簡單地傳回 NULL 指標。然而,對於 B2D 轉換,類別層次結構必須支援多態性,這意味著基底類別中必須至少定義一個虛函數。

在以下範例中,dynamic_cast用於將指向基底類別的指標安全地轉換為指向派生類別的指標:

class Base { virtual void DoIt() = 0; };
class Foo : public Base {};
class Bar : public Base {};
Base* base = new Foo;
Foo* foo = dynamic_cast<Foo*>(base); // Safe run-time cast

如果base實際上指向Bar對象,則dynamic_cast操作將傳回NULL。這確保了類型安全並防止未定義的行為。

以上是C 中的「static_cast」和「dynamic_cast」有什麼不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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