Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Warisan Maya Menyelesaikan Masalah Permulaan Pembina Pusaka Berbilang dalam C?
Warisan Maya dalam C
Apabila berurusan dengan berbilang warisan dalam C , memahami warisan maya adalah penting. 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 /* ... */ };
Dalam contoh ini, C mewarisi daripada A dan B, yang seterusnya mewarisi secara maya daripada Base. GCC menimbulkan ralat kompilasi pada baris yang ditanda kerana ia tidak dapat menentukan pembina yang hendak dipanggil untuk kelas Asas.
Penjelasan:
Kelas asas maya mempunyai mekanisme permulaan yang unik . Tidak seperti kelas asas bukan maya, kelas asas maya tidak dimulakan oleh kelas asas perantaraan tetapi oleh kelas paling banyak terbitan. Ini kerana dalam hierarki warisan berlian, setiap kelas asas ditakrifkan sekali sahaja dan harus dimulakan sekali sahaja oleh kelas terbitan yang paling banyak.
Dalam contoh kami, C ialah kelas terbitan paling banyak. Walau bagaimanapun, ia tidak secara eksplisit memulakan kelas Base dalam pembinanya. Oleh itu, GCC cuba menggunakan pembina lalai Base. Walau bagaimanapun, oleh kerana C tidak mewarisi secara langsung daripada Base, pembina lalai tidak boleh diakses, membawa kepada ralat penyusunan.
Penyelesaian:
Untuk menyelesaikan isu ini, pembina C mesti secara eksplisit memulakan kelas Base menggunakan pemula asas maya:
class C : public A, public B { public: C(C* pParent) : A(pParent), B(pParent), Base(pParent) {} /* ... */ };
Dengan memasukkan Panggilan Base(pParent) dalam pembina C, kami secara eksplisit menentukan pembina Base untuk digunakan, memastikan Base dimulakan dengan betul.
Atas ialah kandungan terperinci Bagaimanakah Warisan Maya Menyelesaikan Masalah Permulaan Pembina Pusaka Berbilang dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!