Mewarisi Pembina: Satu Enigma
Apabila pembina tidak diwarisi seperti yang diharapkan, ia boleh membingungkan. Pertimbangkan coretan kod berikut:
{
public: explicit A(int x) {}
};
kelas B: awam A
{
};
int main(void)
{
B *b = new B(5); delete b;
}
Kod ini menjana ralat kompilasi:
main.cpp:13: error: no matching function for call to ‘B::B(int)’ main.cpp:8: note: candidates are: B::B() main.cpp:8: note: B::B(const B&)
Tanpa diduga, kelas B tidak mewarisi pembina daripada kelas A.
Menyingkap Penyelesaian
Dalam C 03, pembina tidak diwarisi secara automatik. Untuk mewarisi pembina, ia perlu dipanggil secara manual daripada pembina kelas terbitan. Walau bagaimanapun, dengan warisan pembina C 11, pengehadan ini telah dikurangkan.
Memanfaatkan Warisan Pembina
Dengan C 11, menggunakan kata kunci membenarkan pewarisan daripada semua pembina daripada kelas asas. Untuk melakukan ini, hanya tambahkan baris berikut pada kelas terbitan:
using A::A; // Inherits all constructors from class A
Dengan menggunakan teknik ini, semua pembina daripada kelas asas diwarisi ke dalam kelas terbitan.
Pengendalian Pengecualian
Adalah penting untuk ambil perhatian bahawa jika kelas terbitan mentakrifkan pembina secara manual, ia tidak akan mewarisi mana-mana pembina daripada kelas asas. Dalam kes sedemikian, semua pembina mesti ditakrifkan secara manual dan secara eksplisit memanggil pembina kelas asas seperti yang diperlukan.
Kelas Asas Templat
Untuk kelas asas templat, pendekatan yang serupa ialah bekerja. Untuk mewarisi semua pembina daripada kelas asas templat ke dalam kelas terbitan, gunakan sintaks berikut:
using vector<T>::vector; /// Takes all vector's constructors
Pendekatan ini memastikan semua pembina daripada kelas asas diwarisi ke dalam kelas terbitan.
Atas ialah kandungan terperinci Mengapa Kelas Terbitan Saya Tidak Mewarisi Pembina Kelas Asas Saya dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!