Bagikan melalui


Peringatan C26434

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
};