Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Ralat sintaks C++: kelas asas maya mesti dimulakan dengan cara yang unik dalam hierarki yang sama, bagaimana untuk menanganinya?

Ralat sintaks C++: kelas asas maya mesti dimulakan dengan cara yang unik dalam hierarki yang sama, bagaimana untuk menanganinya?

PHPz
PHPzasal
2023-08-22 13:51:42915semak imbas

Ralat sintaks C++: kelas asas maya mesti dimulakan dengan cara yang unik dalam hierarki yang sama, bagaimana untuk menanganinya?

C++, sebagai bahasa pengaturcaraan berorientasikan objek, digunakan secara meluas dalam pembangunan perisian. Kelas asas maya ialah konsep penting dalam C++ dan sering digunakan dalam situasi seperti warisan berbilang dan warisan berlian untuk memastikan keunikan dan konsistensi ahli data. Walau bagaimanapun, dalam proses menggunakan kelas asas maya, kami sering menemui mesej ralat "Kelas asas maya mesti dimulakan dengan cara yang unik dalam hierarki yang sama Artikel ini akan memperkenalkan kaedah untuk menyelesaikan ralat ini."

Pertama, kita perlu memahami apa itu kelas asas maya. Kelas asas maya ialah kelas abstrak yang hanya menyediakan antara muka awam untuk kelas lain dan tidak mempunyai ahli data sebenar. Apabila kelas diperoleh daripada berbilang kelas, dan satu atau lebih daripada kelas ini diperoleh daripada kelas asas maya yang sama, kelas asas maya hanya perlu dimulakan sekali untuk memastikan keunikan dan konsistensi ahli data.

Namun, dalam pengaturcaraan sebenar, kadangkala kami menggunakan kelas asas maya dalam pewarisan berbilang peringkat, dan beberapa masalah akan berlaku. Contohnya, contoh berikut:

 class A
 {
 public:
     int a;
 };
 
 class B: virtual public A
 {
 public:
     int b;
 };
 
 class C: virtual public B
 {
 public:
     int c;
 };
 
 class D: public B, public C
 {
 public:
     int d;
 };

Dalam contoh ini, kami mentakrifkan kelas A, kelas B, kelas C dan kelas D. Antaranya, kelas B dan C kedua-duanya mewarisi daripada kelas A dan juga merupakan kelas asas kelas D. Warisan maya digunakan dalam kelas B dan C untuk memastikan bahawa hanya terdapat satu contoh kelas A dalam kelas D.

Walau bagaimanapun, kami akan menemui mesej ralat berikut semasa menyusun:

 error: cannot allocate an object of abstract type 'D'
 note: because the following virtual functions are pure within 'D':
 note: virtual void A::foo()

Mesej ralat ini menunjukkan bahawa kelas D tidak boleh ditetapkan sebagai jenis abstrak kerana terdapat fungsi maya tulen foo() dalam kelas A yang tidak ditakrifkan. Walau bagaimanapun, kita boleh mendapati bahawa selepas mentakrifkan kelas asas maya, kita tidak memulakan kelas asas maya dalam kelas D, menyebabkan pembina kelas A tidak dipanggil dengan betul dan menyebabkan ralat.

Jadi, bagaimana untuk membetulkan ralat ini? Satu kaedah yang mungkin adalah dengan secara eksplisit memanggil pembina kelas asas maya A dalam pembina kelas D. Kelas D yang diubah suai adalah seperti berikut:

 class A
 {
 public:
     int a;
 };
 
 class B: virtual public A
 {
 public:
     int b;
 };
 
 class C: virtual public B
 {
 public:
     int c;
 };
 
 class D: public B, public C
 {
 public:
     int d;
     D(int i)
         :A(),B(),C(),d(i)
     {
     }
 };

Anda boleh melihat bahawa dalam pembina kelas D, kami menggunakan senarai permulaan untuk memulakan tiga kelas asas maya A, B dan C. Ini mengelakkan masalah permulaan kelas asas maya dan menyelesaikan ralat.

Ringkasnya, kelas asas maya ialah konsep yang sangat penting dalam C++, tetapi apabila menggunakannya, anda perlu memberi perhatian kepada isu permulaan dalam warisan berbilang lapisan. Sesetengah gesaan ralat tidak langsung menghala ke kelas asas maya itu sendiri, tetapi berkaitan dengan kelas asas maya, jadi kita perlu menganalisis dengan teliti gesaan ralat dan menghapuskan ralat dalam masa. Di atas ialah penyelesaian kepada "kelas asas maya mesti dimulakan dengan cara yang unik dalam hierarki yang sama".

Atas ialah kandungan terperinci Ralat sintaks C++: kelas asas maya mesti dimulakan dengan cara yang unik dalam hierarki yang sama, bagaimana untuk menanganinya?. 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