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?

Bagaimanakah `static_cast` Nampaknya Boleh Membenarkan Akses kepada Ahli Kelas Terbitan Apabila Menurunkan Penunjuk Asas kepada Objek Asas yang Berbeza?

Linda Hamilton
Linda Hamiltonasal
2024-11-30 10:35:11311semak imbas

How Can `static_cast` Seemingly Allow Access to a Derived Class's Members When Downcasting a Base Pointer to a Distinct Base Object?

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:

  • Jika penunjuk asas menghala ke objek asas yang merupakan subobjek objek terbitan, maka penunjuk terbitan yang terhasil akan menghala ke objek terbitan yang melampirkan.
  • Jika tidak, keputusan pelakon tidak ditentukan.

Dalam kami contoh:

  • Penunjuk asas menghala ke objek asas yang berbeza daripada mana-mana objek terbitan.
  • Oleh itu, penurunan kepada terbitan* menghasilkan tingkah laku yang tidak ditentukan.

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!

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