Sejauh yang saya mengerti, pengenalan override
kata kunci di C ++ 11 tidak lebih dari sebuah cek untuk memastikan bahwa fungsi yang sedang dilaksanakan adalah fungsi override
dari sebuah virtual
kelas dasar.
Itu saja?
Sejauh yang saya mengerti, pengenalan override
kata kunci di C ++ 11 tidak lebih dari sebuah cek untuk memastikan bahwa fungsi yang sedang dilaksanakan adalah fungsi override
dari sebuah virtual
kelas dasar.
Itu saja?
Jawaban:
Itu memang idenya. Intinya adalah bahwa Anda secara eksplisit tentang apa yang Anda maksudkan, sehingga kesalahan diam dapat didiagnosis:
Kode di atas mengkompilasi, tetapi bukan yang Anda maksudkan (catat yang hilang
const
). Jika Anda mengatakan sebaliknya,virtual int foo() override
maka Anda akan mendapatkan kesalahan kompiler bahwa fungsi Anda sebenarnya tidak mengesampingkan apa pun.sumber
override
fitur baru "memperbaiki" ini; Anda harus ingat untuk menggunakannya, sama seperti Anda seharusnya ingat untuk menulisconst
;)explicit
definisi kelas tidak membuatnya menjadi C ++ 11. Hah.explicit
dilakukan definisi kelas? Tidak pernah mendengar tentang itu sama sekali.override
ketika seseorang bermaksud untuk melakukannya) lebih mungkin daripada mengingat kasus sudut yaitu tidak ada generalitas dalam menyalin fungsi prototipe yang berbeda, hanya penyimpangan seperti hilangconst
atau menulischar
bukanint
, dlloverride
specifier disebutkan dalam jawaban ini , yang lebih futuristik daripada langsung. Jawabannya menunjukkan bahwa, tetapoverride
denganvirtual
metode. Di masa depan ketika seseorang keliru mengubah tanda tangan, kegunaannya akan muncul.Kutipan Wikipedia:
http://en.wikipedia.org/wiki/C%2B%2B11#Explicit_overrides_and_final
Edit (berupaya sedikit meningkatkan jawabannya):
Mendeklarasikan metode sebagai "override" berarti bahwa metode itu dimaksudkan untuk menulis ulang metode (virtual) pada kelas dasar. Metode utama harus memiliki tanda tangan yang sama (setidaknya untuk parameter input) seperti metode yang ingin ditulis ulang.
Mengapa ini perlu? Nah, dua kasus kesalahan umum berikut ini dicegah:
satu salah ketik tipe dalam metode baru. Compiler, tidak menyadari bahwa ia bermaksud untuk menulis metode sebelumnya, cukup menambahkannya ke kelas sebagai metode baru. Masalahnya adalah bahwa metode lama masih ada, yang baru ditambahkan hanya sebagai kelebihan beban. Dalam hal ini, semua panggilan ke metode lama akan berfungsi seperti sebelumnya, tanpa perubahan perilaku (yang akan menjadi tujuan penulisan ulang).
orang lupa untuk mendeklarasikan metode dalam superclass sebagai "virtual", tetapi masih mencoba untuk menulis ulang dalam subkelas. Meskipun hal ini tampaknya diterima, perilaku tersebut tidak akan persis seperti yang dimaksudkan: metode ini tidak virtual, jadi akses melalui pointer ke superclass akan berakhir memanggil metode lama (superclass ') alih-alih metode baru (subclass').
Menambahkan "override" dengan jelas melemahkan ini: melalui ini, seseorang memberi tahu kompilator bahwa tiga hal mengharapkan:
Jika ada yang salah, maka kesalahan ditandai.
* catatan: parameter output kadang-kadang berbeda, tetapi tipe terkait. Baca tentang transformasi kovarian dan kontravarian jika tertarik.
sumber
Ditemukan " override " berguna ketika seseorang memperbarui tanda tangan metode virtual kelas dasar seperti menambahkan parameter opsional tetapi lupa memperbarui tanda tangan metode kelas turunan. Dalam hal ini metode antara basis dan kelas turunan tidak lagi berhubungan polimorfik. Tanpa deklarasi override, sulit untuk menemukan bug semacam ini.
sumber
override
merupakan cara yang bagus untuk menemukan masalah seperti itu, cakupan tes unit yang baik juga harus membantu.Ya begitulah. Ini adalah cek untuk memastikan seseorang tidak mencoba mengganti dan mengacaukannya melalui tanda tangan yang gagal. Berikut adalah halaman Wiki yang menjelaskan ini secara terperinci dan memiliki contoh ilustrasi pendek:
http://en.wikipedia.org/wiki/C%2B%2B11#Explicit_overrides_and_final
sumber
C ++ 17 draft standar
Setelah memeriksa semua
override
hits pada draft standar C ++ 17 N4659 , satu-satunya referensi yang dapat saya temukan untukoverride
pengidentifikasi adalah:jadi saya pikir mungkin meledakkan program yang salah sebenarnya adalah satu-satunya efek.
sumber