Kekaburan Warisan Berbilang: Menyelesaikan Masalah Berlian dengan Warisan Maya
Dalam warisan, "masalah berlian" timbul apabila kelas mewarisi daripada berbilang kelas yang, seterusnya, mewarisi daripada kelas asas biasa. Ini boleh membawa kepada kekaburan apabila memanggil kaedah yang ditakrifkan dalam kelas asas biasa.
Pertimbangkan contoh berikut:
class A { public: void eat() { cout << "A"; } }; class B: virtual public A { public: void eat() { cout << "B"; } }; class C: virtual public A { public: void eat() { cout << "C"; } }; class D: public B, C { public: void eat() { cout << "D"; } }; int main() { A* a = new D(); a->eat(); }
Tanpa warisan maya, objek kelas D akan mempunyai dua kejadian kelas asas A, membawa kepada kekaburan apabila memanggil makan(). Pengkompil tidak boleh menentukan versi eat() yang hendak dilaksanakan.
Warisan maya menyelesaikan masalah ini dengan mencipta satu tika kelas asas biasa. Dalam contoh di atas, hanya akan terdapat satu contoh kelas A dalam objek kelas D. Ini dicapai dengan memperkenalkan jadual penunjuk maya (vtable), yang mengandungi alamat kaedah untuk setiap kelas dalam hierarki warisan. Apabila kaedah dipanggil, pengkompil mencari kaedah dalam vtable bagi kelas yang paling diterbitkan, menghapuskan kekaburan.
Dalam contoh di atas, kelas D akan mempunyai dua penunjuk vtable, satu untuk kelas B dan satu untuk kelas C. Kedua-dua penunjuk vtable akan menunjuk ke objek A yang sama, memastikan bahawa hanya satu contoh eat() dilaksanakan.
Atas ialah kandungan terperinci Bagaimanakah Warisan Maya Menyelesaikan Kekaburan Warisan Berbilang (Masalah Berlian)?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!