Rumah > pembangunan bahagian belakang > C++ > Mengapa Kelas Terbitan Saya Tidak Mewarisi Pembina Kelas Asas Saya dalam C ?

Mengapa Kelas Terbitan Saya Tidak Mewarisi Pembina Kelas Asas Saya dalam C ?

Barbara Streisand
Lepaskan: 2024-12-21 07:35:10
asal
518 orang telah melayarinya

Why Doesn't My Derived Class Inherit My Base Class's Constructor in C  ?

Mewarisi Pembina: Satu Enigma

Apabila pembina tidak diwarisi seperti yang diharapkan, ia boleh membingungkan. Pertimbangkan coretan kod berikut:

kelas A
{

public: 
    explicit A(int x) {}
Salin selepas log masuk

};

kelas B: awam A
{
};

int main(void)
{

B *b = new B(5);
delete b;
Salin selepas log masuk

}

Kod ini menjana ralat kompilasi:

main.cpp:13: error: no matching function for call to ‘B::B(int)’
main.cpp:8: note: candidates are: B::B()
main.cpp:8: note:                 B::B(const B&)
Salin selepas log masuk

Tanpa diduga, kelas B tidak mewarisi pembina daripada kelas A.

Menyingkap Penyelesaian

Dalam C 03, pembina tidak diwarisi secara automatik. Untuk mewarisi pembina, ia perlu dipanggil secara manual daripada pembina kelas terbitan. Walau bagaimanapun, dengan warisan pembina C 11, pengehadan ini telah dikurangkan.

Memanfaatkan Warisan Pembina

Dengan C 11, menggunakan kata kunci membenarkan pewarisan daripada semua pembina daripada kelas asas. Untuk melakukan ini, hanya tambahkan baris berikut pada kelas terbitan:

using A::A; // Inherits all constructors from class A
Salin selepas log masuk

Dengan menggunakan teknik ini, semua pembina daripada kelas asas diwarisi ke dalam kelas terbitan.

Pengendalian Pengecualian

Adalah penting untuk ambil perhatian bahawa jika kelas terbitan mentakrifkan pembina secara manual, ia tidak akan mewarisi mana-mana pembina daripada kelas asas. Dalam kes sedemikian, semua pembina mesti ditakrifkan secara manual dan secara eksplisit memanggil pembina kelas asas seperti yang diperlukan.

Kelas Asas Templat

Untuk kelas asas templat, pendekatan yang serupa ialah bekerja. Untuk mewarisi semua pembina daripada kelas asas templat ke dalam kelas terbitan, gunakan sintaks berikut:

using vector<T>::vector; /// Takes all vector's constructors
Salin selepas log masuk

Pendekatan ini memastikan semua pembina daripada kelas asas diwarisi ke dalam kelas terbitan.

Atas ialah kandungan terperinci Mengapa Kelas Terbitan Saya Tidak Mewarisi Pembina Kelas Asas Saya dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan