Rumah > pembangunan bahagian belakang > C++ > Mengapa Fungsi Maya Dipanggil dalam Pembina Mengembalikan Pelaksanaan Kelas Asas?

Mengapa Fungsi Maya Dipanggil dalam Pembina Mengembalikan Pelaksanaan Kelas Asas?

Mary-Kate Olsen
Lepaskan: 2024-12-10 11:48:34
asal
344 orang telah melayarinya

Why Do Virtual Functions Called in a Constructor Return the Base Class Implementation?

Mengapa Fungsi Maya Tidak Boleh Dipanggil daripada Pembina

Dalam C , fungsi maya memainkan peranan penting dalam polimorfisme dengan mendayakan objek terbitan kelas untuk mengatasi kaedah yang diwarisi daripada kelas asasnya. Walau bagaimanapun, salah tanggapan biasa timbul apabila cuba memanggil fungsi maya dari dalam pembina kelas.

Pertimbangkan contoh kod berikut:

struct base {
   virtual const int value() const {
      return 0;
   }
   base() {
      std::cout << value() << std::endl;
   }
   virtual ~base() {}
};

struct derived : public base {
   virtual const int value() const {
      return 1;
   }
};

int main(void) {
   derived example;
}
Salin selepas log masuk

Apabila kod ini dilaksanakan, ia mengeluarkan "0" dan bukannya jangkaan "1". Mengapa?

Sebabnya terletak pada susunan pelaksanaan pembina. Apabila objek kelas terbitan dicipta, pembina kelas asas dipanggil terlebih dahulu. Pada ketika ini, objek kelas terbitan belum lagi dibina sepenuhnya dan kaedah mayanya tidak boleh dipanggil dengan pasti.

Apabila pembina kelas asas memanggil value(), ia mengakses pelaksanaan kelas asas bagi fungsi maya kerana kelas terbitan belum "matang" menjadi objek terbitan lagi. Untuk memastikan fungsi maya dipanggil dengan betul, ia mesti diakses dari dalam objek yang dibina sepenuhnya.

Oleh itu, untuk membetulkan kod dan output "1", panggilan kaedah value() dalam pembina kelas asas mestilah dialih keluar atau ditangguhkan sehingga selepas objek dibina sepenuhnya.

Atas ialah kandungan terperinci Mengapa Fungsi Maya Dipanggil dalam Pembina Mengembalikan Pelaksanaan Kelas Asas?. 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