Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Warisan Maya Menyelesaikan Masalah Permulaan Pembina Pusaka Berbilang dalam C?

Bagaimanakah Warisan Maya Menyelesaikan Masalah Permulaan Pembina Pusaka Berbilang dalam C?

DDD
Lepaskan: 2024-12-13 05:03:14
asal
199 orang telah melayarinya

How Does Virtual Inheritance Solve Multiple Inheritance Constructor Initialization Problems in 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
  /* ... */
};
Salin selepas log masuk

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) {}
  /* ... */
};
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan