Dalam bidang pengaturcaraan berorientasikan objek, warisan memainkan peranan penting dalam organisasi kod dan penggunaan semula kod. Walau bagaimanapun, dengan pewarisan maya, tingkah laku tertentu boleh menjadi tidak dijangka. Artikel ini bertujuan untuk menjelaskan sebab pembina lalai dipanggil dalam konteks warisan maya, jenis warisan tertentu dalam C .
Warisan maya digunakan untuk menyelesaikan kekaburan dalam pelbagai senario warisan. Ia membenarkan berbilang kelas terbitan untuk mewarisi daripada kelas asas biasa tanpa menyebabkan isu pewarisan berbentuk berlian. Dalam kes sedemikian, kelas asas maya diwarisi sekali sahaja dan pembinanya dipanggil terus oleh kelas terbitan yang paling banyak.
Pertimbangkan coretan kod berikut:
class grandmother { public: grandmother() { cout << "grandmother (default)" << endl; } grandmother(int attr) { cout << "grandmother: " << attr << endl; } }; class mother: virtual public grandmother { public: mother(int attr) : grandmother(attr) { cout << "mother: " << attr << endl; } }; class daughter: virtual public mother { public: daughter(int attr) : mother(attr) { cout << "daughter: " << attr << endl; } }; int main() { daughter x(0); }
Apabila melaksanakan kod ini, kami menghadapi tingkah laku yang membingungkan. Daripada memanggil pembina nenek(int) untuk kelas anak perempuan, seperti yang dijangkakan, pembina lalai untuk kelas nenek dicetuskan. Ini menimbulkan persoalan: mengapa pembina lalai dipanggil?
Kunci untuk memahami tingkah laku ini terletak pada sifat pewarisan maya. Apabila pewarisan maya digunakan, pembina kelas asas maya dipanggil terus oleh pembina kelas yang paling terbitan. Dalam senario ini, memandangkan anak perempuan ialah kelas yang paling banyak terbitan, pembinanya bertanggungjawab untuk memanggil pembina nenek.
Walau bagaimanapun, memandangkan tiada panggilan eksplisit kepada pembina nenek(int) dinyatakan dalam senarai permulaan untuk anak perempuan pembina, pembina lalai digunakan sebaliknya. Untuk membetulkan ini, seseorang perlu memanggil pembina nenek yang dikehendaki secara eksplisit seperti berikut:
daughter(int attr) : grandmother(attr), mother(attr) { ... }
Pengubahsuaian ini memastikan bahawa pembina yang betul untuk kelas nenek digunakan.
Dalam bidang pewarisan maya, memahami mekanik di sebalik doa pembina adalah penting untuk mengelakkan tingkah laku yang tidak dijangka. Dengan memahami bahawa pembina kelas asas maya dipanggil terus oleh pembina kelas yang paling terbit, seseorang boleh menjangka dan mengawal aliran panggilan pembina. Pengetahuan ini memperkasakan pembangun untuk mereka bentuk hierarki warisan yang teguh dan tersusun dengan baik dalam C .
Atas ialah kandungan terperinci Mengapa Warisan Maya Mencetuskan Pembina Lalai dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!