Dalam coretan kod yang disediakan, kami melihat ralat semasa cuba memulakan objek kelas B dengan B *b = baharu B(5);, walaupun terdapat pembina dalam kelas asas A. Ini menimbulkan persoalan mengapa pembina yang diwarisi tidak boleh diakses dalam kes ini.
Kunci untuk memahami isu ini terletak pada peraturan rumit pewarisan pembina dalam C . Dengan ketiadaan warisan pembina yang jelas, kelas terbitan tidak secara automatik mewarisi pembina daripada kelas asasnya. Ini adalah kes dalam piawaian C 03. Untuk mencapai warisan pembina, kelas terbitan mesti menggunakan kata kunci guna secara eksplisit, seperti yang dilihat dalam kod diperbetulkan berikut:
class A { public: explicit A(int x) {} }; class B: public A { using A::A; };
Dengan penambahan menggunakan A::A;, kelas B kini mewarisi pembina daripada kelas A, menyelesaikan ralat. Adalah penting untuk ambil perhatian bahawa warisan ini terpakai kepada semua pembina dalam kelas asas, dan kelas terbitan tidak boleh secara selektif mewarisi pembina tertentu sahaja.
Jika pengkompil anda menyokong standard C 11, anda boleh menggunakan kata kunci menggunakan untuk pembina. harta pusaka. Walau bagaimanapun, dalam piawaian C 03, pembina tidak diwarisi secara lalai, dan perlu dilaksanakan secara manual dalam kelas terbitan dengan memanggil pembina asas.
Untuk kelas asas templat, kata kunci menggunakan juga boleh digunakan untuk warisi pembina seperti yang ditunjukkan dalam contoh ini:
template<class T> class my_vector : public vector<T> { public: using vector<T>::vector; ///Takes all vector's constructors /* */ };
Atas ialah kandungan terperinci Mengapa Kelas Terbitan Tidak Mewarisi Pembina dalam C dan Bagaimana Kami Boleh Membetulkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!