Rumah >pembangunan bahagian belakang >C++ >Mengapakah Pembina Lalai Kelas Pangkalan Maya Dikenakan apabila Objek Kelas Terbitan Dimulakan?

Mengapakah Pembina Lalai Kelas Pangkalan Maya Dikenakan apabila Objek Kelas Terbitan Dimulakan?

Linda Hamilton
Linda Hamiltonasal
2024-11-20 04:22:02669semak imbas

Why is the Default Constructor of a Virtual Base Class Invoked when a Derived Class Object is Instantiated?

Invokasi Pembina Lalai dalam Warisan Maya

Warisan maya, mekanisme pewarisan C, bertujuan untuk menyelesaikan masalah pewarisan berlian atau pewarisan berulang. Dalam konteks ini, satu persoalan timbul: mengapakah pembina lalai kelas asas maya digunakan apabila membuat instantiat objek kelas terbitan?

Tingkah laku ini berpunca daripada reka bentuk warisan maya. Tidak seperti pewarisan tradisional, di mana pembina kelas asas dipanggil oleh pembina kelas terbitan melalui senarai permulaan, dalam pewarisan maya, pembina kelas paling terbitan secara langsung memanggil pembina kelas asas maya.

Dalam contoh yang disediakan:

class grandmother {
public:
    grandmother() {
        std::cout << "grandmother (default)" << std::endl;
    }
    grandmother(int attr) {
        std::cout << "grandmother: " << attr << std::endl;
    }
};

class mother: virtual public grandmother {
public:
    mother(int attr) : grandmother(attr) {
        std::cout << "mother: " << attr << std::endl;
    }
};

class daughter: virtual public mother {
public:
    daughter(int attr) : mother(attr) {
        std::cout << "daughter: " << attr << std::endl;
    }
};

Apabila membuat instantiat objek jenis anak perempuan, pembina anak perempuan terus memanggil pembina nenek. Walau bagaimanapun, oleh kerana tiada pembina khusus digunakan dalam senarai permulaan pembina anak perempuan, pembina lalai nenek dipanggil secara lalai.

Untuk memanggil pembina yang dikehendaki secara eksplisit, senarai permulaan pembina anak perempuan mesti diubah suai kepada:

daughter(int attr) : grandmother(attr), mother(attr) { ... }

Dengan berbuat demikian, pembina nenek yang betul dipanggil, dan output akan menyertakan baris berikut:

grandmother: 0

Memahami tingkah laku ini adalah penting apabila bekerja dengan maya warisan, kerana ia memastikan permulaan yang betul dan pembinaan objek.

Atas ialah kandungan terperinci Mengapakah Pembina Lalai Kelas Pangkalan Maya Dikenakan apabila Objek Kelas Terbitan Dimulakan?. 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