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
Lepaskan: 2024-12-21 05:24:10
asal
400 orang telah melayarinya

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

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!

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