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:
struct Base
{
virtual int foo() const;
};
struct Derived : Base
{
virtual int foo() // whoops!
{
// ...
}
};
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.
override
fitur baru "memperbaiki" ini; Anda harus ingat untuk menggunakannya, sama seperti Anda seharusnya ingat untuk menulis const
;)
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 hilang const
atau menulis char
bukan int
, dll
override
specifier disebutkan dalam jawaban ini , yang lebih futuristik daripada langsung. Jawabannya menunjukkan bahwa, tetap override
dengan virtual
metode. Di masa depan ketika seseorang keliru mengubah tanda tangan, kegunaannya akan muncul.
Kutipan Wikipedia:
Override pengidentifikasi khusus berarti bahwa kompiler akan memeriksa kelas dasar untuk melihat apakah ada fungsi virtual dengan tanda tangan yang tepat ini. Dan jika tidak ada, kompiler akan error out.
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.
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.
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
C ++ 17 draft standar
Setelah memeriksa semua override
hits pada draft standar C ++ 17 N4659 , satu-satunya referensi yang dapat saya temukan untuk override
pengidentifikasi adalah:
5 Jika fungsi virtual ditandai dengan override spec-specifier dan tidak mengesampingkan fungsi anggota dari kelas dasar, program ini salah bentuk. [Contoh:
struct B { virtual void f(int); }; struct D : B { virtual void f(long) override; // error: wrong signature overriding B::f virtual void f(int) override; // OK }
- contoh akhir]
jadi saya pikir mungkin meledakkan program yang salah sebenarnya adalah satu-satunya efek.