Warisan Maya dan Invokasi Pembina Lalai
Dalam hierarki warisan yang melibatkan warisan maya, pembina lalai kelas asas maya boleh dipanggil tanpa diduga . Pertimbangkan kod berikut:
class grandmother { public: grandmother() { // Default constructor std::cout << "grandmother (default)" << std::endl; } grandmother(int attr) { // Parameterized constructor 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; } }; int main() { daughter x(0); }
Apabila contoh kelas anak perempuan dicipta, outputnya ialah:
grandmother (default) mother: 0 daughter: 0
Walaupun wujud pembina berparameter dalam kelas nenek, pembina lalai dipanggil. Mengapa ini berlaku?
Invokasi Pembina Kelas Pangkalan Maya
Dalam warisan maya, pembina kelas asas maya dipanggil terus oleh pembina kelas yang paling terbitan. Dalam kes ini, pembina anak perempuan secara terus memanggil pembina nenek.
Memandangkan kelas ibu tidak secara eksplisit memanggil pembina nenek dalam senarai permulaannya, pembina lalai digunakan. Untuk memanggil pembina yang dikehendaki dengan betul, pembina anak perempuan hendaklah diubah suai kepada:
daughter(int attr) : grandmother(attr), mother(attr) { ... }
Dengan memanggil pembina nenek(attr) secara eksplisit dalam senarai permulaan, pembina yang betul digunakan, dan output menjadi:
grandmother: 0 mother: 0 daughter: 0
Atas ialah kandungan terperinci . Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!