Mengapa Warisan Maya Mencetuskan Pembina Lalai dalam C ?

Linda Hamilton
Lepaskan: 2024-11-22 12:32:17
asal
578 orang telah melayarinya

Why Does Virtual Inheritance Trigger the Default Constructor in C  ?

Memahami Warisan Maya dalam C : Mengapa Default Constructor Dipanggil

Dalam bidang pengaturcaraan berorientasikan objek, warisan memainkan peranan penting dalam organisasi kod dan penggunaan semula kod. Walau bagaimanapun, dengan pewarisan maya, tingkah laku tertentu boleh menjadi tidak dijangka. Artikel ini bertujuan untuk menjelaskan sebab pembina lalai dipanggil dalam konteks warisan maya, jenis warisan tertentu dalam C .

Warisan Maya: Pengenalan Ringkas

Warisan maya digunakan untuk menyelesaikan kekaburan dalam pelbagai senario warisan. Ia membenarkan berbilang kelas terbitan untuk mewarisi daripada kelas asas biasa tanpa menyebabkan isu pewarisan berbentuk berlian. Dalam kes sedemikian, kelas asas maya diwarisi sekali sahaja dan pembinanya dipanggil terus oleh kelas terbitan yang paling banyak.

Dilema: Default Constructor Invocation

Pertimbangkan coretan kod berikut:

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

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

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

int main() {
    daughter x(0);
}
Salin selepas log masuk

Apabila melaksanakan kod ini, kami menghadapi tingkah laku yang membingungkan. Daripada memanggil pembina nenek(int) untuk kelas anak perempuan, seperti yang dijangkakan, pembina lalai untuk kelas nenek dicetuskan. Ini menimbulkan persoalan: mengapa pembina lalai dipanggil?

Merungkai Misteri: Kesan Warisan Maya

Kunci untuk memahami tingkah laku ini terletak pada sifat pewarisan maya. Apabila pewarisan maya digunakan, pembina kelas asas maya dipanggil terus oleh pembina kelas yang paling terbitan. Dalam senario ini, memandangkan anak perempuan ialah kelas yang paling banyak terbitan, pembinanya bertanggungjawab untuk memanggil pembina nenek.

Walau bagaimanapun, memandangkan tiada panggilan eksplisit kepada pembina nenek(int) dinyatakan dalam senarai permulaan untuk anak perempuan pembina, pembina lalai digunakan sebaliknya. Untuk membetulkan ini, seseorang perlu memanggil pembina nenek yang dikehendaki secara eksplisit seperti berikut:

daughter(int attr) : grandmother(attr), mother(attr) { ... }
Salin selepas log masuk

Pengubahsuaian ini memastikan bahawa pembina yang betul untuk kelas nenek digunakan.

Kesimpulan

Dalam bidang pewarisan maya, memahami mekanik di sebalik doa pembina adalah penting untuk mengelakkan tingkah laku yang tidak dijangka. Dengan memahami bahawa pembina kelas asas maya dipanggil terus oleh pembina kelas yang paling terbit, seseorang boleh menjangka dan mengawal aliran panggilan pembina. Pengetahuan ini memperkasakan pembangun untuk mereka bentuk hierarki warisan yang teguh dan tersusun dengan baik dalam C .

Atas ialah kandungan terperinci Mengapa Warisan Maya Mencetuskan Pembina Lalai 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