Rumah > Artikel > pembangunan bahagian belakang > Ralat sintaks C++: warisan maya mesti menggunakan senarai permulaan pembina, bagaimana untuk menanganinya?
Dalam pengaturcaraan C++, menggunakan warisan maya adalah teknik biasa yang boleh digunakan untuk menyelesaikan masalah warisan berbilang. Walau bagaimanapun, apabila kita menggunakan warisan maya, kita perlu memberi perhatian kepada masalah: warisan maya mesti menggunakan senarai permulaan pembina. Jika senarai permulaan pembina tidak digunakan, ralat sintaks akan berlaku, yang akan menyebabkan atur cara gagal untuk menyusun. Jadi, bagaimana kita harus menangani masalah ini? Seterusnya, mari kita bincangkannya.
Dalam C++, warisan maya ialah kaedah pewarisan khas yang boleh digunakan untuk menyelesaikan masalah kekaburan semasa pewarisan berbilang. Apabila kelas mewarisi daripada dua atau lebih kelas asas pada masa yang sama, jika kelas asas ini mempunyai kelas induk yang sama, maka akan terdapat berbilang sub-objek kelas asas dalam kelas terbitan, yang akan membawa kepada kekaburan. Fungsi warisan maya adalah untuk memastikan bahawa berbilang kelas terbitan yang secara langsung atau tidak langsung mewarisi kelas tertentu mengandungi hanya satu sub-objek kelas tersebut.
Apabila menggunakan warisan maya, anda perlu menggunakan kata kunci maya untuk mentakrifkan kelas asas sebagai kelas asas maya. Selain itu, dalam kelas terbitan, senarai pemula pembina diperlukan untuk memulakan kelas asas maya. Ini kerana pembina kelas terbitan paling banyak bertanggungjawab untuk pembinaan sub-objek kelas asas maya. Jika pembina kelas asas maya tidak dipanggil secara eksplisit dalam pembina, pengkompil akan memanggil pembina lalai kelas asas maya secara lalai, yang akan mengakibatkan ralat sintaks.
Oleh itu, warisan maya mesti menggunakan senarai permulaan pembina, jika tidak, pengkompil akan menggesa ralat. Berikut ialah contoh atur cara yang menunjukkan ralat sintaks yang disebabkan oleh tidak menggunakan senarai permulaan pembina apabila menggunakan warisan maya:
#include <iostream> using namespace std; class Base { public: Base(int n) : num(n) {} protected: int num; }; class Derived : virtual public Base { // 虚继承 public: Derived(int n) { // 在构造函数中没有使用构造函数初始化列表 num = n; } }; int main() { Derived d(10); cout << d.num << endl; return 0; }
Dalam atur cara di atas, kami mentakrifkan kelas asas maya Pangkalan dan mentakrifkan kelas Terbitan sebagai maya Mewarisi kelas Asas . Dalam pembina kelas Derived, kelas Asas tidak dimulakan menggunakan senarai permulaan pembina. Ini akan menyebabkan pengkompil melaporkan ralat, mendorong "ralat: pembina untuk 'Derived' mesti secara eksplisit memulakan kelas asas 'Base' yang tidak mempunyai pembina lalai".
Untuk menangani masalah bahawa warisan maya mesti menggunakan senarai permulaan pembina, kita boleh mengambil pendekatan berikut.
(1) Panggil secara eksplisit pembina kelas asas maya dalam senarai permulaan pembina
Ini ialah penyelesaian yang paling biasa. Dalam senarai permulaan pembina bagi kelas terbitan, panggil pembina kelas asas maya secara eksplisit untuk memastikan sub-objek kelas asas maya dimulakan dengan betul. Sekarang ubah suai pembina kelas Terbitan dalam contoh atur cara di atas dan tambah senarai permulaan pembina untuk menyelesaikan masalah ralat sintaks:
class Derived : virtual public Base { // 虚继承 public: Derived(int n) : Base(n) { // 在构造函数初始化列表中调用Base类的构造函数 num = n; } };
Dengan cara ini, atur cara boleh disusun dan diluluskan secara normal.
(2) Tambahkan pembina lalai kepada kelas asas maya
Jika kelas asas maya tidak mempunyai pembina lalai, maka dalam kelas terbitan, pembina kelas asas maya mesti dipanggil secara eksplisit dalam senarai permulaan pembina . Walau bagaimanapun, kadangkala kita mungkin tidak dapat mengubah suai kod sumber kelas asas maya Dalam kes ini, kita boleh menyelesaikan masalah dengan menambah pembina lalai kepada kelas asas maya. Berikut ialah contoh program:
class Base { public: Base(int n) : num(n) {} Base() {} // 添加默认构造函数 protected: int num; }; class Derived : virtual public Base { // 虚继承 public: Derived(int n) { // 在构造函数中不需要调用Base类的构造函数 num = n; } };
Dalam contoh program ini, kami menambah pembina lalai ke kelas asas maya Base, supaya dalam pembina kelas terbitan Derived, tidak perlu memanggil secara eksplisit pembina Base kelas .
Ringkasnya, apabila menggunakan warisan maya, pastikan anda menggunakan senarai permulaan pembina untuk memulakan kelas asas maya untuk mengelakkan ralat sintaks. Jika anda tidak boleh mengubah suai kod sumber kelas asas maya, anda boleh menambah pembina lalai untuk menyelesaikan masalah.
Atas ialah kandungan terperinci Ralat sintaks C++: warisan maya mesti menggunakan senarai permulaan pembina, bagaimana untuk menanganinya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!