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
Barbara Streisandasal
2024-12-21 02:03:15819semak imbas

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
}

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;
  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
  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!

Kenyataan:
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