Rumah >pembangunan bahagian belakang >C++ >Mengapa Memanggil Fungsi Maya dalam Pembina Kelas Asas Mencetak Nilai Kelas Asas, Bukan Nilai Kelas Terbitan?

Mengapa Memanggil Fungsi Maya dalam Pembina Kelas Asas Mencetak Nilai Kelas Asas, Bukan Nilai Kelas Terbitan?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-21 05:24:10402semak imbas

Why Does Calling a Virtual Function in a Base Class Constructor Print the Base Class Value, Not the Derived Class Value?

Invokasi Pembina Fungsi Maya

Dalam C , pembina bertanggungjawab untuk memulakan objek. Walau bagaimanapun, apabila berurusan dengan kelas terbitan dan fungsi maya, tingkah laku tertentu boleh timbul yang mungkin tidak intuitif serta-merta.

Pertimbangkan contoh berikut:

#include <iostream>

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

Dalam contoh ini, kami mempunyai asas pangkalan kelas dengan nilai fungsi maya(). Kelas terbitan yang diperolehi diwarisi daripada asas dan mengatasi nilai(). Pembina dalam asas cuba memanggil value() dalam pembinanya.

Apabila pembina terbitan dipanggil, pembina asas dipanggil dahulu. Pada ketika ini, objek masih dalam keadaan kelas asas, dan value() menyelesaikan kepada pelaksanaan kelas asas. Inilah sebabnya mengapa program mencetak "0" dan bukannya "1" yang dijangkakan.

Untuk menangani isu ini, kita perlu memastikan bahawa objek dimulakan sepenuhnya sebagai kelas terbitan sebelum memanggil value() dalam pembina . Satu cara untuk mencapainya ialah dengan melambatkan panggilan ke value() sehingga selepas pembina terbitan dilaksanakan, yang boleh dilakukan dengan menggunakan fungsi maya dalam pembina kelas terbitan.

Atas ialah kandungan terperinci Mengapa Memanggil Fungsi Maya dalam Pembina Kelas Asas Mencetak Nilai Kelas Asas, Bukan Nilai Kelas Terbitan?. 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