Rumah >pembangunan bahagian belakang >C++ >Bilakah menggunakan `static_cast` untuk merendahkan dalam kelakuan tidak ditentukan C?

Bilakah menggunakan `static_cast` untuk merendahkan dalam kelakuan tidak ditentukan C?

Patricia Arquette
Patricia Arquetteasal
2024-11-27 14:16:10703semak imbas

When is using `static_cast` for downcasting in C   undefined behavior?

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!

Kenyataan:
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