Downcasting dengan Static_cast dalam C
Downcasting ialah teknik yang digunakan dalam pengaturcaraan berorientasikan objek untuk menghantar penunjuk kelas asas atau merujuk kepada turunan penunjuk kelas atau rujukan. Dalam C , ini boleh dicapai menggunakan pengendali static_cast.
Pertimbangkan contoh kod berikut:
class Base { public: Base() {} virtual void func(); }; class Derived : public Base { public: Derived() {} void func(); void func_d(); int a; }; int main() { Base *b = new Base(); std::cout << sizeof(*b) << std::endl; // Prints 4 Derived *d = static_cast<Derived *>(b); std::cout << sizeof(*d) << std::endl; // Prints 8 d->func_d(); }
Dalam contoh ini, penunjuk jenis Base dicipta dan dimulakan dengan objek jenis Base. Operator sizeof mengembalikan 4, menunjukkan saiz objek Base.
Walau bagaimanapun, apabila kita cuba menghantar b ke penunjuk jenis Diperoleh menggunakan static_cast dan menetapkannya kepada d, saiz *d menjadi 8, yang merupakan saiz objek Terbitan. Tingkah laku ini tidak dijangka, kerana biasanya kita menjangkakan saiz *d sama dengan saiz *b.
Sebab tingkah laku ini terletak pada konsep tingkah laku tidak ditentukan (UB). Menggunakan static_cast untuk menghantar objek kepada jenis ia sebenarnya tidak mempunyai hasil UB. Dalam kes ini, b menunjuk kepada objek Asas, bukan objek Terbitan. Static_cast tidak boleh menukar jenis asas objek, dan oleh itu hasil cast tidak ditentukan.
Standard C, dalam bahagian 5.2.9 ([expr.static.cast]), menentukan peraturan untuk downcasting menggunakan static_cast: "Jika nilai prvalue jenis 'penunjuk ke cv1 B' menunjuk ke B yang sebenarnya merupakan subobjek objek jenis D, penunjuk yang terhasil menunjuk ke objek tertutup jenis D. Jika tidak, hasil cast tidak ditentukan."
Dalam kes ini, objek Asas yang ditunjuk oleh b bukan subobjek objek Terbitan, dan oleh itu hasilnya pelakon tidak ditentukan. Gejala UB boleh berbeza-beza secara meluas, dan tiada jaminan bahawa fungsi ahli terbitan (func_d) boleh dipanggil dengan jayanya.
Atas ialah kandungan terperinci Bilakah menggunakan `static_cast` untuk merendahkan dalam kelakuan tidak ditentukan C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!