Kami selalu mendeklarasikan fungsi virtual murni sebagai:
virtual void fun () = 0 ;
Yaitu, selalu ditugaskan ke 0.
Apa yang saya pahami adalah bahwa ini adalah untuk menginisialisasi entri vtable untuk fungsi ini ke NULL dan nilai lainnya di sini menghasilkan kesalahan waktu kompilasi. Apakah pemahaman ini benar atau tidak?
c++
abstract-class
pure-virtual
Mukeshkumar
sumber
sumber
virtual void func() = 100;
Jawaban:
Alasan
=0
yang digunakan adalah bahwa Bjarne Stroustrup tidak berpikir dia bisa mendapatkan kata kunci lain, seperti "murni" melewati komunitas C ++ pada saat fitur tersebut sedang dilaksanakan. Ini dijelaskan dalam bukunya, The Design & Evolution of C ++ , bagian 13.2.3:Dia juga menyatakan secara eksplisit bahwa ini tidak perlu mengatur entri vtable ke NULL, dan melakukannya bukan cara terbaik untuk mengimplementasikan fungsi virtual murni.
sumber
Seperti kebanyakan pertanyaan "Mengapa" tentang desain C ++, tempat pertama untuk melihat adalah Desain dan Evolusi C ++ , oleh Bjarne Stroustrup 1 :
1 §13.2.3 Sintaks
sumber
Bagian 9.2 dari standar C ++ memberikan sintaks untuk anggota kelas. Ini termasuk produksi ini:
Tidak ada yang spesial dari nilai tersebut. "= 0" hanyalah sintaks untuk mengatakan "fungsi ini murni virtual." Ini tidak ada hubungannya dengan inisialisasi atau null pointer atau nilai numerik nol, meskipun kesamaan dengan hal-hal itu mungkin memiliki nilai mnemonik.
sumber
= 0
Apa lagi yang ingin Anda ketahui? Itu akan sama dengan bertanya mengapa fungsi tubuh dibungkus dengan {} Jawabannya adalah, karena itulah yang mendefinisikan sintaksis C ++.Saya tidak yakin apakah ada makna di balik ini. Itu hanya sintaks bahasa.
sumber
C ++ selalu menghindar dari memperkenalkan kata kunci baru, karena kata-kata baru yang dicadangkan menghancurkan program lama yang menggunakan kata-kata ini untuk pengidentifikasi. Ini sering dilihat sebagai salah satu kekuatan bahasa yang menghormati kode lama sejauh mungkin.
The
= 0
sintaks memang mungkin telah dipilih karena menyerupai pengaturan entri vtable untuk0
, tapi ini adalah murni simbolis. (Sebagian besar kompiler menetapkan entri vtable tersebut ke sebuah rintisan yang memancarkan kesalahan sebelum membatalkan program.) Sintaksinya terutama dipilih karena tidak digunakan untuk apa pun sebelumnya dan itu menyelamatkan memperkenalkan kata kunci baru.sumber
pure
kata kunci akan sangat bagus dalam buku saya. Bagaimanapun, ada baiknya memahami alasannya.#define pure = 0
.C ++ harus memiliki cara untuk membedakan fungsi virtual murni dari deklarasi fungsi virtual normal. Mereka memilih untuk menggunakan
= 0
sintaks. Mereka bisa saja dengan mudah melakukan hal yang sama dengan menambahkan kata kunci murni. Tetapi C ++ cukup enggan untuk menambahkan kata kunci baru dan lebih suka menggunakan mekanisme lain untuk memperkenalkan fitur.sumber
Tidak ada "initilaized" atau "ditugaskan" nol dalam kasus ini.
= 0
hanya dalam konstruksi sintaksis yang terdiri dari=
dan0
token, yang sama sekali tidak ada hubungannya dengan inisialisasi atau penugasan.Ini tidak ada hubungannya dengan nilai aktual di "vtable". Bahasa C ++ tidak memiliki gagasan "vtable" atau apapun seperti itu. Berbagai "vtables" tidak lebih dari sekadar detail implementasi spesifik.
sumber
Saya ingat membaca bahwa pembenaran untuk sintaks lucu adalah bahwa itu lebih mudah (dalam hal standar-penerimaan) daripada memperkenalkan kata kunci lain yang akan melakukan hal yang sama.
Saya percaya ini disebutkan dalam Desain dan Evolusi C ++ oleh Bjarne Stroustrup.
sumber
Saya akan berasumsi bahwa ini hanya bagian dari tata bahasa C ++. Saya tidak berpikir ada batasan bagaimana kompiler benar-benar mengimplementasikan ini untuk format biner tertentu. Anda anggap mungkin tepat untuk kompiler C ++ awal.
sumber
The
= 0
mendeklarasikan fungsi virtual murni .Saya pikir itu tidak benar. Itu hanya sintaks khusus. Vtable ditentukan oleh implementasi. Tidak ada yang mengatakan entri vtable untuk anggota murni harus benar-benar nol pada konstruksi (meskipun sebagian besar kompiler menangani vtable serupa).
sumber
= 0
dilakukan adalah membuat seluruh kelas abstrak dan melarang panggilan virtual ke fungsi murni. Panggilan non-virtual masih sangat baik, yaitu ketika definisi (jika Anda memberikan satu) digunakan.__cxa_pure_virtual
arobenko.gitbooks.io/bare_metal_cpp/content/compiler_output/… bukannya Base :: f ()Nah, Anda juga dapat menginisialisasi entri vtable untuk menunjuk ke fungsi sebenarnya "
Tampaknya intuitif bahwa entri vtable dapat didefinisikan untuk menunjuk ke mana saja (0) atau ke suatu fungsi. Membiarkan Anda menentukan nilai Anda sendiri untuk itu mungkin akan menghasilkan menunjuk ke sampah, bukan ke suatu fungsi. Tapi itu sebabnya "= 0" diizinkan dan "= 1" tidak. Saya menduga Neil Butterworth benar tentang mengapa "= 0" digunakan sama sekali
sumber