Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Ralat sintaks C++: Ralat sintaks warisan, bagaimana untuk membetulkannya?

Ralat sintaks C++: Ralat sintaks warisan, bagaimana untuk membetulkannya?

WBOY
WBOYasal
2023-08-21 21:46:461577semak imbas

Dalam pengaturcaraan C++, warisan ialah konsep penting yang membolehkan kita mentakrifkan kelas dan memperoleh (atau mewarisi) kelas ini daripada kelas lain. Apabila kita menggunakan warisan, subkelas secara automatik mewarisi semua pembolehubah ahli dan kaedah kelas induknya supaya kita boleh menggunakan semula kod tersebut.

Namun, apabila menggunakan warisan, kadangkala anda menghadapi ralat sintaks warisan. Ralat ini boleh menyebabkan kod gagal untuk disusun, atau menyebabkan ralat semasa runtime. Artikel ini menerangkan beberapa ralat sintaks warisan biasa dan cara membetulkannya.

  1. Kebenaran akses kelas asas adalah tidak betul
    Dalam C++, anda boleh menggunakan tiga kata kunci awam, dilindungi dan peribadi untuk menentukan kebenaran akses ahli kelas. Apabila kita mewarisi daripada kelas, pembolehubah ahli dan kaedah kelas terbitan mewarisi hak akses kelas asasnya. Jika pembolehubah ahli atau kaedah dalam kelas asas diisytiharkan dilindungi atau peribadi, dan apabila anda ingin mengakses pembolehubah atau kaedah ahli ini dalam subkelas, ralat kebenaran akses akan berlaku.

Penyelesaian: Tukar hak akses pembolehubah ahli atau kaedah dalam kelas asas kepada awam, atau gunakan kata kunci "menggunakan" dalam kelas terbitan untuk mengimport nama kelas asas.

  1. Menggunakan sintaks yang salah untuk menentukan kelas terbitan
    Dalam C++, apabila mentakrifkan kelas terbitan, anda perlu menggunakan titik bertindih ":" untuk menentukan kelas asas. Jika kolon tidak digunakan, atau sintaks yang salah digunakan semasa menggunakan warisan, pengkompil akan mengadu.

Sebagai contoh, kod berikut menggunakan sintaks yang salah:

class B: A {
  //...
};

Kod di atas tidak menyatakan kebenaran akses selepas menggunakan titik bertindih Ia harus ditukar kepada:

class B : public A {
  //...
};

Penyelesaian: Sintaks yang betul mesti digunakan untuk mentakrifkan kelas terbitan. iaitu Gunakan titik bertindih selepas nama kelas terbitan untuk menentukan nama dan hak akses kelas asas.

  1. Pembina kelas asas tiada dalam kelas terbitan
    Dalam kelas terbitan, jika pembina kelas asas tidak ditentukan atau pembina kelas asas tidak dipanggil dengan betul, ralat kompilasi akan berlaku.

Penyelesaian: Dalam pembina kelas terbitan, gunakan pembina kelas asas untuk memulakan pembolehubah ahli kelas asas. Ini boleh dicapai dengan memanggil pembina kelas asas dalam senarai pemula pembina kelas terbitan:

class B : public A {
public:
  B(int n) : A(n) { //调用 A 的构造函数
    //...
  }
};
  1. Ralat sintaks warisan berbilang
    Dalam C++, kita juga boleh menggunakan berbilang warisan untuk memperoleh kelas daripada pelbagai jenis kelas. Dalam berbilang warisan, kita perlu menggunakan koma "," untuk memisahkan berbilang nama kelas asas. Jika sintaks yang salah digunakan semasa menggunakan berbilang warisan, pengkompil akan melaporkan ralat.

Sebagai contoh, kod berikut menggunakan sintaks yang salah:

class B : public A1, A2 {
  //...
};

Kod di atas tidak menyatakan kebenaran akses dan harus ditukar kepada:

class B : public A1, public A2 {
  //...
};

Penyelesaian: Pewarisan berbilang mesti ditakrifkan menggunakan sintaks yang betul, iaitu menggunakan koma untuk memisahkan berbilang Dipisahkan oleh nama kelas asas, kebenaran akses mesti dinyatakan sebelum setiap nama kelas asas.

  1. Konflik penamaan dalam warisan
    Dalam warisan, mungkin terdapat pembolehubah ahli atau nama kaedah yang sama dalam kelas asas dan kelas terbitan, yang akan menyebabkan konflik penamaan. Apabila ini berlaku, pengkompil akan membuang ralat.

Penyelesaian: Anda boleh menggunakan operator resolusi skop "::" untuk membezakan pembolehubah dan kaedah ahli kelas asas daripada pembolehubah dan kaedah ahli kelas terbitan. Contohnya:

class A {
public:
  int n;
};
class B : public A {
public:
  int n;
  void print() {
    cout << A::n << endl; //调用基类的 n 变量
    cout << n << endl;    //调用派生类的 n 变量
  }
};

Artikel ini memperkenalkan beberapa ralat sintaks warisan biasa dan penyelesaiannya. Apabila menulis program C++, sintaks warisan yang betul mesti diikuti untuk memastikan kod tersebut disusun dan berjalan dengan betul. Jika anda menghadapi ralat, anda harus menyemak kod dengan segera dan membetulkannya.

Atas ialah kandungan terperinci Ralat sintaks C++: Ralat sintaks warisan, bagaimana untuk membetulkannya?. 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