Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Warisan Maya dalam C Mengendalikan Permulaan Kelas Asas dalam Masalah Berlian?

Bagaimanakah Warisan Maya dalam C Mengendalikan Permulaan Kelas Asas dalam Masalah Berlian?

Patricia Arquette
Patricia Arquetteasal
2024-12-19 22:18:11319semak imbas

How Does Virtual Inheritance in C   Handle Base Class Initialization in Diamond Problems?

Memahami Warisan Maya dalam C

Apabila berurusan dengan hierarki warisan yang kompleks, C menawarkan warisan maya sebagai mekanisme untuk menyelesaikan masalah berlian, situasi di mana kelas terbitan mewarisi daripada kelas asas yang sama melalui berbilang laluan. Walau bagaimanapun, penggunaan warisan maya kadangkala boleh mengakibatkan ralat kompilasi yang tidak dijangka.

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 menyusun kod ini, GCC melaporkan ralat pada baris yang ditunjukkan. Ralat berpunca daripada fakta bahawa kelas C tidak menyediakan permulaan untuk Base. Kelas asas maya dimulakan hanya oleh kelas paling banyak yang boleh dilihat. Dalam kes ini, itu ialah kelas C.

Pembina lalai untuk Base tidak digunakan semasa pemulaan kerana kelas asas maya tidak pernah diwarisi secara langsung. Ia mesti dimulakan melalui senarai pemula atau dengan memberikannya kepada objek lain daripada jenis yang sama atau terbitan. Dalam kes ini, kelas C tidak menentukan pemulaan untuk Base, yang membawa kepada ralat penyusunan.

Untuk menyelesaikan masalah ini, kod harus diubah suai untuk memasukkan permulaan eksplisit untuk Base dalam pembina kelas C. Ini boleh dicapai dengan menggantikan pembina C dengan yang berikut:

class C : public A, public B {
public:
  C(C* pParent) : Base(pParent), A(pParent), B(pParent) {} // - Correct initialization here
  /* ... */
};

Dengan secara eksplisit memulakan Base dalam pembina kelas C, pengkompil kini boleh mengendalikan warisan maya dengan betul dan berjaya menyusun kod.

Atas ialah kandungan terperinci Bagaimanakah Warisan Maya dalam C Mengendalikan Permulaan Kelas Asas dalam Masalah Berlian?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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