在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]),靜態僅當滿足以下條件時才允許從基類指針強制轉換為派生類指針:
以上是為什麼當原始指標指向基底類別物件時,派生指標的「static_cast」似乎存取了 C 中的整個派生物件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!