Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah `static_cast` Nampaknya Boleh Membenarkan Akses kepada Ahli Kelas Terbitan Apabila Menurunkan Penunjuk Asas kepada Objek Asas yang Berbeza?
Menurun Menggunakan Operator static_cast: Menyahmistifikasi Tingkah Laku Tidak Ditakrifkan
Pertimbangkan kebimbangan 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 senario ini , menghantar penuding asas kepada penuding terbitan menggunakan static_cast has seolah-olah membenarkan akses kepada saiz dan fungsi objek terbitan penuh. Walau bagaimanapun, ini menimbulkan persoalan: bagaimanakah perkara ini boleh berlaku jika penuding asas pada asalnya menunjuk kepada objek asas yang berbeza?
Memahami Tingkah Laku Tidak Ditakrifkan
Jawapannya terletak pada sifat static_cast dan kesannya pada objek dinamik. Menurunkan menggunakan static_cast kepada jenis yang sebenarnya tidak ada pada objek dikelaskan sebagai gelagat tidak ditentukan. Akibat daripada tingkah laku yang tidak ditentukan boleh berbeza-beza secara mendadak, termasuk membenarkan akses yang tidak dijangka kepada fungsi ahli kelas yang diperolehi func_d() dalam kes ini.
Peraturan Menurunkan
Mengikut standard C (bahagian 5.2.9), downcasting menggunakan static_cast mengikuti tertentu peraturan:
Dalam kami contoh:
Kejayaan yang tidak dijangka untuk memanggil d->func_d() adalah akibat daripada ini tingkah laku yang tidak ditentukan. Jangan bergantung pada keupayaan untuk mengakses ahli kelas yang diperolehi selepas kejatuhan yang tidak selamat.
Atas ialah kandungan terperinci Bagaimanakah `static_cast` Nampaknya Boleh Membenarkan Akses kepada Ahli Kelas Terbitan Apabila Menurunkan Penunjuk Asas kepada Objek Asas yang Berbeza?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!