首頁 > 後端開發 > C++ > 為什麼當原始指標指向基底類別物件時,派生指標的「static_cast」似乎存取了 C 中的整個派生物件?

為什麼當原始指標指向基底類別物件時,派生指標的「static_cast」似乎存取了 C 中的整個派生物件?

DDD
發布: 2024-11-26 15:20:10
原創
344 人瀏覽過

Why Does `static_cast` to a Derived Pointer Seem to Access the Entire Derived Object in C   When the Original Pointer Points to a Base Class Object?

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

在C 中,向下轉型是指將基類指針或引用轉換為派生類指針或引用。執行向下轉型的一種方式是透過使用 static_cast 。

考慮以下程式碼:

class base {
    base();
    virtual void func();
};

class derived : public base {
    derived();
    void func();
    void func_d();
    int a;
};

int main() {
    base *b = new base();
    sizeof(*b); // Gives 4.
    derived *d = static_cast<derived*>(b);
    sizeof(*d); // Gives 8- means whole derived obj size..why?
    d->func_d();
}
登入後複製

在此範例中,我們有一個基底類別 base 和一個衍生類別衍生。我們建立一個基底類別指標 b 指向基底類型的物件。使用 static_cast,我們嘗試將 b 強制轉換為衍生類別指標 d。

這裡令人困惑的問題是,為什麼派生類別指標 d 可以存取整個派生類別對象,儘管 b 指向基底類別

但是,了解使用 static_cast 是至關重要的。將指標強制轉換為不屬於的型別在 C 中被視為未定義行為

根據C 標準([expr.static.cast]),靜態僅當滿足以下條件時才允許從基類指針強制轉換為派生類指針:

  1. 存在從「指標到衍生類別指標」的有效標準轉換D」到「指向B 的指標」(其中D 是衍生類,B是基類)。
  2. 如果指向的基類對象實際上是派生類對象的子對象,則結果指針應指向封閉的派生類
  3. 如果不滿足其中任何一個條件,則轉換的結果是未定義的。指向純基類對象,因此有沒有要指向的封閉派生類對象。

以上是為什麼當原始指標指向基底類別物件時,派生指標的「static_cast」似乎存取了 C 中的整個派生物件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板