首頁 >後端開發 >C++ >C 中向下轉型的靜態轉型何時是安全的以及何時會導致未定義的行為?

C 中向下轉型的靜態轉型何時是安全的以及何時會導致未定義的行為?

Barbara Streisand
Barbara Streisand原創
2024-11-28 02:50:11401瀏覽

When is Static Casting for Downcasting in C   Safe and When Does it Result in Undefined Behavior?

在C 中使用靜態轉換進行向下轉型

在物件導向程式設計中,向下轉換是一種用於將指向基底類別的指標轉換為指向衍生類別的指標。在 C 中,這可以使用 static_cast 運算子來完成。

考慮以下程式碼:

class Base {
  public:
    Base() {}
    virtual void func() {}
};

class Derived : public Base {
  public:
    Derived() {}
    void func() {}
    void func_d() {}
    int a;
};

int main() {
  Base *b = new Base();
  std::cout << sizeof(*b) << std::endl;  // Prints 4

  Derived *d = static_cast<Derived *>
(b);  // Downcast the base pointer to a derived pointer
  std::cout << sizeof(*d) << std::endl;  // Prints 8

  d->func_d();  // Calls the derived class function
}

在此程式碼中,基底類別指標最初指向 Base 物件。使用 static_cast,我們將基底指標向下轉換為衍生類別指標。 sizeof 運算子顯示派生指標現在指向一個更大大小(8 位元組)的對象,其中包括 Derived 類別的成員。

但是,需要注意的是,此處執行的向下轉換是無效的。只有當基底指標指向的物件實際上是衍生類別的實例時,Static_cast 才允許轉換。在這種情況下,Base 對像不是 Derived 對象,導致向下轉型未定義行為。

根據 C 標準,使用 static_cast 向下轉型遵循以下規則:

  1. 基類指標必須指向從目標類別派生的物件。
  2. 目標類別不能是基底類別的虛擬基底類別class。
  3. 結果指標將指向派生物件中的基底類別子物件。

如果不符合這些條件,則強制轉換將導致未定義的行為。因此,仔細執行向下轉換並確保轉換的有效性至關重要。

以上是C 中向下轉型的靜態轉型何時是安全的以及何時會導致未定義的行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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