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