Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Fungsi 'turunan::function' menyembunyikan fungsi non-virtual 'base::function' (c.128).
Panduan Inti C++
C.128: Fungsi virtual harus menentukan tepat salah satu virtual, penimpaan, atau final
Keterangan
Ketika Anda memperkenalkan fungsi yang memiliki nama yang sama dengan fungsi non-virtual di kelas dasar, Anda mungkin mendapatkan perilaku yang tidak terduga. Ini seperti memperkenalkan nama variabel yang bertentangan dengan nama dari cakupan luar. Misalnya, Anda mungkin bermaksud mengambil alih fungsi kelas dasar. Jika tanda tangan fungsi tidak cocok, penimpaan yang Anda maksudkan dapat berubah menjadi kelebihan beban sebagai gantinya. Secara umum, persembunyian nama berbahaya dan rawan kesalahan.
Dalam pemeriksaan Pedoman Inti:
- Hanya fungsi yang tidak mengesampingkan di kelas saat ini yang diperiksa.
- Hanya fungsi non-virtual kelas dasar yang dipertimbangkan.
- Tidak ada pencocokan tanda tangan yang dilakukan. Peringatan dipancarkan jika nama yang tidak memenuhi syarat cocok.
Contoh
Contoh ini menunjukkan bagaimana kelas turunan dapat menyembunyikan fungsi non-virtual, dan bagaimana fungsi virtual memungkinkan kelebihan beban dan penimpaan:
// C26434.cpp
struct Base
{
virtual ~Base() = default;
virtual void is_virtual() noexcept {}
void not_virtual() noexcept {}
};
struct Derived : Base
{
void is_virtual() noexcept override {} // Okay, override existing function
virtual void is_virtual(int i) noexcept {} // Add a virtual overload for function
void not_virtual() noexcept {} // C26434, hides a non-virtual function
virtual void not_virtual(int i) noexcept {} // C26434, and parameters ignored
};