Rumah >pembangunan bahagian belakang >C++ >Bilakah Downcasting dalam C Selamat, dan Bilakah Ia Membawa kepada Gelagat Tidak Ditakrifkan?

Bilakah Downcasting dalam C Selamat, dan Bilakah Ia Membawa kepada Gelagat Tidak Ditakrifkan?

Patricia Arquette
Patricia Arquetteasal
2024-11-29 18:32:10277semak imbas

When is Downcasting in C   Safe, and When Does it Lead to Undefined Behavior?

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!

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