首頁 >後端開發 >C++ >當將基底指標向下轉換為不同的基底物件時,「static_cast」如何看似允許存取派生類別的成員?

當將基底指標向下轉換為不同的基底物件時,「static_cast」如何看似允許存取派生類別的成員?

Linda Hamilton
Linda Hamilton原創
2024-11-30 10:35:11311瀏覽

How Can `static_cast` Seemingly Allow Access to a Derived Class's Members When Downcasting a Base Pointer to a Distinct Base Object?

使用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();
}

考慮以下問題:

考慮以下問題:

考慮以下問題:

考慮以下問題:

在此場景中,使用static_cast將基底指標轉換為派生指標似乎允許存取完整的派生指標物件的大小和功能。然而,這提出了一個問題:如果基指標最初指向一個不同的基對象,這怎麼可能?

  • 理解未定義的行為
  • 答案在於static_cast 的性質及其對動態物件的影響。使用 static_cast 向下轉換為物件實際上不具有的類型被歸類為
未定義行為

。未定義行為的後果可能會有很大差異,包括在這種情況下允許意外存取衍生類別成員函數 func_d()。

向下轉型規則
  • 根據C 標準(第5.2.9 節),使用static_cast 向下轉型遵循特定的規則規則:
如果基指針指向作為派生對象的子對象的基對象,則生成的派生指針將指向封閉的派生對象。

否則,轉換的結果是未定義的。 在我們的範例:基底指標指向與任何衍生物件不同的基底物件。 因此,向下轉換為衍生* 會導致未定義的行為。 呼叫 d->func_d() 的意外成功是這種未定義行為的結果。不要依賴在不安全的向下轉型後訪問派生類別成員的能力。

以上是當將基底指標向下轉換為不同的基底物件時,「static_cast」如何看似允許存取派生類別的成員?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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