Rumah >pembangunan bahagian belakang >C++ >Bilakah Casting Statik untuk Downcasting dalam C Selamat dan Bilakah Ia Mengakibatkan Gelagat Tidak Ditakrifkan?

Bilakah Casting Statik untuk Downcasting dalam C Selamat dan Bilakah Ia Mengakibatkan Gelagat Tidak Ditakrifkan?

Barbara Streisand
Barbara Streisandasal
2024-11-28 02:50:11463semak imbas

When is Static Casting for Downcasting in C   Safe and When Does it Result in Undefined Behavior?

Downcasting dengan Static Cast dalam C

Dalam pengaturcaraan berorientasikan objek, downcasting ialah teknik yang digunakan untuk menukar penunjuk kepada kelas asas kepada penunjuk kepada kelas terbitan. Dalam C , ini boleh dilakukan menggunakan pengendali static_cast.

Pertimbangkan 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);  // Downcast the base pointer to a derived pointer
  std::cout << sizeof(*d) << std::endl;  // Prints 8

  d->func_d();  // Calls the derived class function
}

Dalam kod ini, penuding kelas asas pada mulanya menunjuk ke objek Base. Menggunakan static_cast, kami menurunkan penuding asas kepada penuding kelas terbitan. Operator sizeof mendedahkan bahawa penuding terbitan kini menghala ke objek bersaiz lebih besar (8 bait), yang termasuk ahli kelas Derived.

Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa penurunan yang dilakukan di sini adalah tidak sah. Static_cast membenarkan penukaran hanya jika objek yang ditunjuk oleh penuding asas sebenarnya adalah contoh kelas terbitan. Dalam kes ini, objek Base bukan objek Terbitan, menjadikan gelagat downcast tidak ditentukan.

Menurut standard C, downcasting menggunakan static_cast mengikut peraturan ini:

  1. Kelas asas penunjuk mesti menunjuk ke objek yang diperoleh daripada kelas sasaran.
  2. Kelas sasaran mestilah bukan kelas asas maya bagi kelas asas.
  3. Penunjuk terhasil akan menghala ke subobjek kelas asas dalam objek terbitan.

Jika syarat ini tidak dipenuhi, pelakon akan menghasilkan gelagat yang tidak ditentukan. Oleh itu, adalah penting untuk melakukan downcasting dengan berhati-hati dan memastikan kesahihan penukaran.

Atas ialah kandungan terperinci Bilakah Casting Statik untuk Downcasting dalam C Selamat dan Bilakah Ia Mengakibatkan 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