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
Barbara Streisandasal
2024-12-21 07:35:10519semak imbas

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) {}

};

kelas B: awam A
{
};

int main(void)
{

B *b = new B(5);
delete b;

}

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&)

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

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

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!

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