首頁  >  文章  >  後端開發  >  什麼時候在 C 未定義行為中使用「static_cast」向下轉換?

什麼時候在 C 未定義行為中使用「static_cast」向下轉換?

Patricia Arquette
Patricia Arquette原創
2024-11-27 14:16:10630瀏覽

When is using `static_cast` for downcasting in C   undefined behavior?

在C 中使用Static_cast 進行向下轉型

向下轉型是物件導向程式設計中使用的技術,用於將基底類別指標或引用強制轉換為衍生類別指標或引用。在 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);
    std::cout << sizeof(*d) << std::endl; // Prints 8
    d->func_d();
}

在此範例中,建立了一個 Base 類型的指針,並使用下列物件進行初始化:型別基地。 sizeof 運算子傳回 4,表示 Base 物件的大小。

但是,當我們嘗試使用 static_cast 將 b 轉換為 Derived 類型的指標並將其分配給 d 時,*d 的大小變為 8,這是派生物件的大小。這種行為是出乎意料的,因為我們通常期望 *d 的大小與 *b 的大小相同。

這種行為的原因在於未定義行為 (UB) 的概念。使用 static_cast 將物件轉換為它實際上不具有的類型會產生 UB。在本例中,b 指向 Base 對象,而不是 Derived 對象。 Static_cast 無法改變物件的底層類型,因此轉換的結果是未定義的。

C 標準,在第5.2.9 節([expr.static.cast])中,指定了向下轉換的規則使用static_cast:「如果'指向cv1 B 的指標'類型的純右值指向實際上是D 類型物件的子物件的B,則結果指標指向類型的封閉物件D.否則,強制轉換的結果是未定義的。 UB 的症狀差異很大,無法保證衍生成員函數(func_d)能夠成功呼叫。

以上是什麼時候在 C 未定義行為中使用「static_cast」向下轉換?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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