Rumah > pembangunan bahagian belakang > C++ > Mengapa Memanggil Fungsi Maya dalam Pembina Kelas Asas Menghasilkan Pelaksanaan Kelas Asas Digunakan?

Mengapa Memanggil Fungsi Maya dalam Pembina Kelas Asas Menghasilkan Pelaksanaan Kelas Asas Digunakan?

Barbara Streisand
Lepaskan: 2024-12-21 02:03:15
asal
778 orang telah melayarinya

Why Does Calling a Virtual Function in a Base Class Constructor Result in the Base Class Implementation Being Used?

Mengatasi Fungsi Maya dalam Pembina

Pertimbangkan coretan kod berikut:

#include <iostream>
struct base {
  virtual const int value() const {
    return 0;
  }

  base() { // Default constructor
    std::cout << value() << std::endl;
  }
};

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

int main() {
  derived d; // Declares an instance of the derived class
}
Salin selepas log masuk

Apabila kami menjalankan kod ini, ia mencetak 0 dan bukannya 1 yang dijangkakan. Mengapa?

Panggilan Fungsi Maya Semasa Pembinaan

Apabila pembina kelas asas memanggil fungsi maya dalam pembina, fungsi maya dipanggil pada contoh kelas asas dan bukannya contoh kelas terbitan. Ini adalah hasil daripada proses 'kematangan' objek semasa pembinaan.

  • Kematangan: Apabila objek dibina, ia bermula dengan pembina kelas asas dan secara beransur-ansur "matang " ke dalam jenis kelas terbitan.

Dalam contoh kami, pembina asas memanggil value() apabila objek sebahagiannya dibina. Pada ketika ini, objek itu belum lagi "matang" menjadi objek terbitan. Oleh itu, pelaksanaan asas nilai() dipanggil.

Cara Menyelesaikan Isu

Untuk membuat cetakan kod 1, anda boleh mengelak daripada memanggil fungsi maya dalam pembina. Ini boleh dicapai dengan:

  1. Menggunakan Penunjuk: Panggil fungsi maya dari penunjuk atau rujukan kepada kelas asas dan bukannya terus dari fungsi ahlinya:

    base* b = new derived();
    b->value(); // Calls the derived class implementation
    
    delete b;
    Salin selepas log masuk
  2. Menggunakan Senarai Permulaan Ahli: Gunakan ahli senarai permulaan untuk menyatakan secara eksplisit nilai fungsi maya dalam pembina:

    derived d : base() { } // Initializes `base()` and the virtual function
                           // call to occur within the constructor
    Salin selepas log masuk
  3. Atas ialah kandungan terperinci Mengapa Memanggil Fungsi Maya dalam Pembina Kelas Asas Menghasilkan Pelaksanaan Kelas Asas Digunakan?. 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