Rumah > pembangunan bahagian belakang > C++ > Mengapa Kelas Terbitan Tidak Mewarisi Pembina dalam C dan Bagaimana Kami Boleh Membetulkannya?

Mengapa Kelas Terbitan Tidak Mewarisi Pembina dalam C dan Bagaimana Kami Boleh Membetulkannya?

DDD
Lepaskan: 2025-01-05 08:52:40
asal
688 orang telah melayarinya

Why Don't Derived Classes Inherit Constructors in C   and How Can We Fix It?

Mewarisi Pembina: Kisah Warisan

Dalam coretan kod yang disediakan, kami melihat ralat semasa cuba memulakan objek kelas B dengan B *b = baharu B(5);, walaupun terdapat pembina dalam kelas asas A. Ini menimbulkan persoalan mengapa pembina yang diwarisi tidak boleh diakses dalam kes ini.

Kunci untuk memahami isu ini terletak pada peraturan rumit pewarisan pembina dalam C . Dengan ketiadaan warisan pembina yang jelas, kelas terbitan tidak secara automatik mewarisi pembina daripada kelas asasnya. Ini adalah kes dalam piawaian C 03. Untuk mencapai warisan pembina, kelas terbitan mesti menggunakan kata kunci guna secara eksplisit, seperti yang dilihat dalam kod diperbetulkan berikut:

class A {
    public:
        explicit A(int x) {}
};

class B: public A {
     using A::A;
};
Salin selepas log masuk

Dengan penambahan menggunakan A::A;, kelas B kini mewarisi pembina daripada kelas A, menyelesaikan ralat. Adalah penting untuk ambil perhatian bahawa warisan ini terpakai kepada semua pembina dalam kelas asas, dan kelas terbitan tidak boleh secara selektif mewarisi pembina tertentu sahaja.

Jika pengkompil anda menyokong standard C 11, anda boleh menggunakan kata kunci menggunakan untuk pembina. harta pusaka. Walau bagaimanapun, dalam piawaian C 03, pembina tidak diwarisi secara lalai, dan perlu dilaksanakan secara manual dalam kelas terbitan dengan memanggil pembina asas.

Untuk kelas asas templat, kata kunci menggunakan juga boleh digunakan untuk warisi pembina seperti yang ditunjukkan dalam contoh ini:

template<class T>
class my_vector : public vector<T> {
    public:
    using vector<T>::vector; ///Takes all vector's constructors
    /* */
};
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapa Kelas Terbitan Tidak Mewarisi Pembina dalam C dan Bagaimana Kami Boleh Membetulkannya?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan