Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Warisan Maya Menyelesaikan Masalah Berlian dalam C?

Bagaimanakah Warisan Maya Menyelesaikan Masalah Berlian dalam C?

Mary-Kate Olsen
Lepaskan: 2024-12-08 09:10:15
asal
734 orang telah melayarinya

How Does Virtual Inheritance Solve the Diamond Problem in C  ?

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

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

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!

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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan