Rumah >pembangunan bahagian belakang >C++ >Bilakah Downcasting dalam C Selamat, dan Bilakah Ia Membawa kepada Gelagat Tidak Ditakrifkan?
Downcasting dalam C : Unveiling the Undefined Behavior
Dalam pengaturcaraan berorientasikan objek, downcasting ialah proses menukar penunjuk atau rujukan sesuatu kelas asas kepada penunjuk atau rujukan kelas terbitan. Dalam C , ini boleh dicapai menggunakan pengendali static_cast. Walau bagaimanapun, akibat daripada penurunan yang tidak betul boleh membingungkan.
Pertimbangkan coretan 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(); // Calls derived class function successfully }
Dalam contoh ini, penunjuk asas b dibuang ke penuding terbitan d menggunakan static_cast. Yang menghairankan, d mempunyai akses kepada keseluruhan objek terbitan, termasuk fungsi ahli func_d(). Ini menimbulkan persoalan: bagaimanakah ini boleh dilakukan apabila b hanya menunjuk kepada objek asas?
Jawapannya terletak pada tingkah laku tidak ditentukan yang diperkenalkan oleh downcasting yang tidak betul. Mengikut piawaian C, menggunakan static_cast untuk menghantar penuding kepada jenis yang tidak benar-benar menghasilkan tingkah laku yang tidak ditentukan. Ini bermakna apa-apa sahaja boleh berlaku, termasuk pelaksanaan yang betul bagi fungsi kelas terbitan.
Pendekatan yang betul untuk downcasting melibatkan penggunaan operator cast selamat seperti dynamic_cast. Operator ini menyemak sama ada penuding asas menghala ke objek terbitan sebenar dan melemparkan pengecualian jika tidak, memastikan keselamatan jenis yang betul.
Atas ialah kandungan terperinci Bilakah Downcasting dalam C Selamat, dan Bilakah Ia Membawa kepada Gelagat Tidak Ditakrifkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!