Rumah > pembangunan bahagian belakang > C++ > Mengapakah `static_cast` kepada Penunjuk Terbitan Nampaknya Mengakses Keseluruhan Objek Terbitan dalam C Apabila Penunjuk Asal Menuding ke Objek Kelas Asas?

Mengapakah `static_cast` kepada Penunjuk Terbitan Nampaknya Mengakses Keseluruhan Objek Terbitan dalam C Apabila Penunjuk Asal Menuding ke Objek Kelas Asas?

DDD
Lepaskan: 2024-11-26 15:20:10
asal
337 orang telah melayarinya

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?

Menurun dengan Cast Statik dalam C

Dalam C , downcasting merujuk kepada penukaran penuding kelas asas atau rujukan kepada penuding atau rujukan kelas terbitan. Satu cara untuk melakukan downcasting adalah melalui penggunaan static_cast<> operator.

Pertimbangkan kod berikut:

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();
}
Salin selepas log masuk

Dalam contoh ini, kita mempunyai asas kelas asas dan kelas terbitan yang diterbitkan. Kami mencipta penunjuk kelas asas b yang menunjuk kepada objek jenis asas. Menggunakan static_cast<>, kami cuba menghantar b ke penunjuk kelas terbitan d.

Persoalan yang mengelirukan di sini ialah mengapa penunjuk kelas terbitan d mempunyai akses kepada keseluruhan objek kelas terbitan, walaupun b menunjuk ke pangkalan objek kelas.

Walau bagaimanapun, adalah penting untuk memahami bahawa menggunakan static_cast<> untuk menghantar penuding kepada jenis yang bukan miliknya dianggap gelagat tidak ditentukan dalam C .

Menurut piawai C ([expr.static.cast]), statik hantar ke penuding kelas terbitan daripada penuding kelas asas hanya dibenarkan jika syarat berikut dipenuhi:

  1. Terdapat penukaran standard yang sah daripada "penunjuk kepada D" kepada "penunjuk kepada B" (dengan D ialah kelas terbitan dan B ialah kelas asas).
  2. B bukan kelas asas maya D atau kelas asas bagi kelas asas maya D.
  3. Jika objek kelas asas yang ditunjuk sebenarnya adalah subobjek objek kelas terbitan, penunjuk yang terhasil harus menunjuk kepada kelas terbitan yang disertakan objek.

Jika mana-mana syarat ini tidak dipenuhi, hasil lakonan tidak ditentukan.

Dalam kod yang diberikan, memandangkan b menunjuk kepada objek kelas asas tulen, terdapat tiada melampirkan objek kelas terbitan untuk ditunjuk. Oleh itu, tingkah laku program menjadi tidak dapat diramalkan dan tidak boleh dipercayai.

Atas ialah kandungan terperinci Mengapakah `static_cast` kepada Penunjuk Terbitan Nampaknya Mengakses Keseluruhan Objek Terbitan dalam C Apabila Penunjuk Asal Menuding ke Objek Kelas Asas?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan