Linda Hamilton
Lepaskan: 2024-11-16 15:25:03
asal
674 orang telah melayarinya

Why is the default constructor of the virtual base class called in a virtual inheritance hierarchy?

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);
}
Salin selepas log masuk

Apabila contoh kelas anak perempuan dicipta, outputnya ialah:

grandmother (default)
mother: 0
daughter: 0
Salin selepas log masuk

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) { ... }
Salin selepas log masuk

Dengan memanggil pembina nenek(attr) secara eksplisit dalam senarai permulaan, pembina yang betul digunakan, dan output menjadi:

grandmother: 0
mother: 0
daughter: 0
Salin selepas log masuk

Atas ialah kandungan terperinci . 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