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

Mengapa Fungsi Maya C Dipanggil daripada Pembina Mengembalikan Nilai Kelas Asas?

Susan Sarandon
Susan Sarandonasal
2024-12-06 13:24:12669semak imbas

Why Do C   Virtual Functions Called from a Constructor Return the Base Class Value?

Mengapa Fungsi Maya C Dipanggil daripada Pembina Mungkin Berkelakuan Tidak Dijangka

Dalam C , fungsi maya menyediakan pengikatan dinamik, membenarkan kelas terbitan mengatasi sesuatu fungsi yang ditakrifkan dalam kelas asasnya. Walau bagaimanapun, menggunakan fungsi maya daripada pembina boleh membawa kepada hasil yang tidak dijangka.

Pertimbangkan coretan kod 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;
}

Kod mentakrifkan dua kelas, asas dan terbitan, dengan fungsi maya nilai(). Pembina asas memanggil value() semasa pemulaan objek. Seseorang mungkin mengharapkan kod untuk mencetak "1" apabila dijalankan, kerana objek jenis yang diperoleh sedang dibina. Walau bagaimanapun, ia mengeluarkan "0" sebaliknya.

Sebab tingkah laku ini terletak pada susunan pembinaan objek. Apabila memulakan objek jenis yang diperoleh, pembina kelas asas dipanggil terlebih dahulu. Pada ketika ini, objek belum dimulakan sepenuhnya dan mungkin tidak mempunyai ahli data khusus kelas terbitan yang dimulakan. Akibatnya, memanggil value() daripada pembina asas memanggil pelaksanaan kelas asas fungsi, yang mengembalikan 0.

Untuk mencapai gelagat yang dimaksudkan, fungsi value() harus dipanggil daripada pasca pembinaan peringkat, di mana objek dijamin untuk dimulakan sepenuhnya. Ini boleh dilakukan dengan mengatasi fungsi value() dalam kelas terbitan dan memanggilnya daripada kaedah berasingan yang dijamin akan dipanggil selepas pembinaan. Contohnya:

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

Dalam kes ini, kaedah get_value() boleh dipanggil daripada pembina untuk mendapatkan nilai "1" yang betul.

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