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(); }
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:
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!