Rumah > Artikel > pembangunan bahagian belakang > Ralat sintaks C++: Panggilan pembina kelas asas tidak betul, bagaimana untuk menanganinya?
Ralat sintaks C++: Panggilan pembina kelas asas tidak betul, bagaimana untuk menanganinya?
Dalam pengaturcaraan C++, kita sering menghadapi situasi di mana pembina kelas asas dipanggil. Walau bagaimanapun, semasa proses ini, kadangkala pembina kelas asas dipanggil secara tidak betul. Keadaan ini sering mengakibatkan program keluar secara tidak normal atau menyebabkan ralat yang tidak diketahui. Jika anda menghadapi situasi ini, jangan panik Artikel ini akan memberi anda pengenalan terperinci kepada panggilan pembina kelas asas yang salah dan cara menanganinya.
1. Panggilan pembina kelas asas yang salah
Dalam C++, pembina kelas terbitan mesti memanggil pembina kelas asasnya untuk memastikan semua ahli kelas asas dimulakan dengan betul. Secara umumnya, memanggil pembina kelas asas dalam senarai permulaan ahli bagi pembina kelas terbitan ialah kaedah yang paling biasa. Walau bagaimanapun, apabila anda membuat kesilapan dalam memanggil pembina kelas asas, akan ada situasi di mana pembina kelas asas dipanggil dengan tidak betul. Di bawah disenaraikan beberapa situasi biasa di mana panggilan pembina kelas asas tidak betul:
#include<iostream> using namespace std; class Base{ public: Base(){} Base(int a){ cout<<"Base class with value : "<<a<<" ";} }; class Derived: public Base{ public: Derived(){} Derived(int a){ cout<<"Derived class with value : "<<a<<" ";} }; int main(){ Derived d(10); // 编译错误:没有与此调用匹配的函数 return 0; }
#include<iostream> using namespace std; class Base{ public: Base(){ cout<<"Base class constructor called "; } }; class Derived: public Base{ public: Derived(){ cout<<"Derived class constructor called "; } Derived(int a){ cout<<"Derived class constructor with value : "<<a<<" called "; } }; int main(){ Derived d; return 0; }
Hasil keluaran ialah:
Base class constructor called Derived class constructor called
Dalam kod di atas, pembina kelas Terbitan memanggil pembina kelas Asas, jadi "Pembina kelas asas dipanggil" adalah output, tetapi memandangkan kelas Terbitan mempunyai hanya satu pembina, jadi Pembina tanpa parameter dipanggil secara lalai, jadi "Pembina kelas terbitan dipanggil" juga dikeluarkan. Jika anda memanggil pembina kelas asas dua kali, anda akan mendapat ralat:
#include<iostream> using namespace std; class Base{ public: Base(){ cout<<"Base class constructor called "; } }; class Derived: public Base{ public: Derived(){ cout<<"Derived class constructor called "; } Derived(int a){ cout<<"Derived class constructor with value : "<<a<<" called "; } }; int main(){ Derived d(10); return 0; }
Outputnya ialah:
Base class constructor called Derived class constructor with value : 10 called Base class constructor called
Oleh kerana pembina kelas Asas dipanggil dua kali dalam pembina kelas Derived, ia adalah output dua kali "Kelas asas pembina dipanggil". Ini kerana dalam C++, proses pembinaan objek kelas terbitan mula-mula memanggil pembina kelas asas dan kemudian memanggil pembina kelas terbitan. Oleh itu, jika anda memanggil pembina kelas asas dua kali dalam pembina kelas terbitan, pembina kelas asas akan dipanggil dua kali, menyebabkan ralat.
#include<iostream> using namespace std; class Base{ public: Base(){ f(); } virtual void f(){ cout<<"Base "; } }; class Derived: public Base{ public: Derived(){ cout<<"Derived "; } void f(){ cout<<"Derived "; } }; int main(){ Derived d; return 0; }
Hasil keluarannya ialah:
Derived
Dalam atur cara di atas, fungsi f() dalam pembina kelas asas ialah fungsi maya, dan apabila objek Terbitan dicipta, pembina kelas terbitan terlebih dahulu memanggil pembina daripada kelas asas , jadi fungsi f() kelas Asas dipanggil. Walau bagaimanapun, apabila f() dipanggil dalam pembina kelas asas, pembina objek kelas terbitan belum lagi dilaksanakan, jadi fungsi f() dalam kelas terbitan belum lagi dipanggil, hanya fungsi f() bagi kelas asas telah dipanggil. Oleh itu, output adalah "Asas" dan bukannya "Terbitan".
2. Bagaimana untuk menangani panggilan pembina kelas asas yang salah?
Jika anda menghadapi situasi di mana pembina kelas asas dipanggil dengan salah, bagaimanakah anda harus menanganinya? Di bawah disenaraikan beberapa cara untuk menangani panggilan pembina kelas asas yang salah:
Ringkasnya, apabila anda menghadapi panggilan yang salah kepada pembina kelas asas, jangan panik Anda harus menyemak ralat dengan teliti dan mengendalikannya mengikut kaedah pemprosesan di atas. Dengan cara ini, anda boleh mengelakkan ralat menjalankan program dengan berkesan disebabkan oleh panggilan yang salah kepada pembina kelas asas.
Atas ialah kandungan terperinci Ralat sintaks C++: Panggilan pembina kelas asas tidak betul, bagaimana untuk menanganinya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!