Memahami C Warisan Maya
Dalam pengaturcaraan berorientasikan objek, warisan maya ialah mekanisme yang menyelesaikan masalah berlian, di mana warisan berbilang boleh membawa kepada kekaburan dalam pemulaan objek. Pertimbangkan coretan kod berikut:
class Base { public: Base(Base* pParent); /* implements basic stuff */ }; class A : virtual public Base { public: A(A* pParent) : Base(pParent) {} /* ... */ }; class B : virtual public Base { public: B(B* pParent) : Base(pParent) {} /* ... */ }; class C : public A, public B { public: C(C* pParent) : A(pParent), B(pParent) {} // - Compilation error here /* ... */ };
Apabila cuba menyusun kod ini, GCC melaporkan ralat kompilasi pada baris yang ditanda. Sebab ralat ini terletak pada cara warisan maya berbeza daripada warisan biasa.
Warisan maya memperkenalkan perhubungan tidak langsung antara kelas paling banyak terbitan dan kelas asas maya. Dalam kes ini, C tidak mewarisi secara langsung daripada Base, tetapi melalui kelas asas mayanya A dan B. Ini bermakna permulaan Base dalam pembina C diwakilkan kepada pembina kelas paling banyak terbitan, yang dalam kes ini ialah C .
Walau bagaimanapun, C tidak memulakan subobjek Base secara eksplisit dalam senarai pemulanya. Oleh itu, pembina lalai untuk Base mesti dipanggil untuk memulakan subobjek ini. Walau bagaimanapun, pembina lalai untuk Base tidak boleh diakses dalam skop pembina C, kerana ia bukan kelas asas langsung C.
Untuk menyelesaikan isu ini, C mesti secara eksplisit memanggil pembina lalai untuk Base dalamnya senarai pemula. Ini memastikan bahawa subobjek Pangkalan maya dimulakan dengan betul. Kod yang diperbetulkan akan kelihatan seperti ini:
class C : public A, public B { public: C(C* pParent) : A(pParent), B(pParent), Base() {} // - Explicit call to Base() /* ... */ };
Atas ialah kandungan terperinci Bagaimanakah Warisan Maya Menyelesaikan Masalah Berlian dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!