Rumah >pembangunan bahagian belakang >C++ >Patutkah Pemusnah Maya Tulen dalam C Dilaksanakan?
Apabila mentakrifkan kelas asas abstrak dalam C , mungkin tergoda untuk mengisytiharkan pemusnah maya sebagai maya semata-mata, sebagai ditunjukkan dalam coretan kod di bawah:
class A { public: virtual ~A() = 0; };
Sementara sintaks ini sah dalam penyusun tertentu, seperti MSVC, ia menimbulkan bahaya mengintai yang boleh membawa kepada ranap masa jalan.
Isu dengan kod di atas ialah pemusnah maya diisytiharkan menjadi murni tanpa menyediakan pelaksanaan. Ini bermakna bahawa tingkah laku pemusnah diwakilkan kepada kelas terbitan konkrit. Walau bagaimanapun, jika objek jenis A itu sendiri pernah dimusnahkan, pemusnahnya akan dipanggil, dan kekurangan pelaksanaannya akan mengakibatkan tingkah laku yang tidak ditentukan.
Dalam senario biasa, memperoleh daripada kelas asas abstrak A dan cuba memusnahkan objek kelas terbitan akhirnya akan menggunakan pemusnah A. Tanpa pelaksanaan, ini boleh mencetuskan gelagat yang tidak ditentukan pada platform tertentu, seperti menggunakan pengendali panggilan tulen dan ranap program.
Untuk menyelesaikan isu ini, asas abstrak pemusnah kelas harus dilaksanakan secara eksplisit, walaupun badannya kosong. Coretan kod yang diperbetulkan di bawah menunjukkan perkara ini:
class A { public: virtual ~A() = 0; }; inline A::~A() { }
Dengan menyediakan pelaksanaan kosong untuk pemusnah A, anda memastikan kelakuannya ditakrifkan apabila dipanggil secara terus atau melalui kelas terbitan.
Atas ialah kandungan terperinci Patutkah Pemusnah Maya Tulen dalam C Dilaksanakan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!