Bagikan melalui


Peringatan C26436

Jenis 'simbol' dengan fungsi virtual membutuhkan destruktor virtual publik atau non-virtual yang dilindungi (c.35)

Pedoman Inti C++: C.35: Destruktor kelas dasar harus publik dan virtual, atau dilindungi dan non-virtual

Jika kelas mendefinisikan fungsi virtual, itu menjadi polimorfik, yang menyiratkan bahwa kelas turunan dapat mengubah perilakunya termasuk manajemen sumber daya dan logika penghancuran. Karena kode klien dapat memanggil jenis polimorfik melalui pointer ke kelas dasar, tidak mungkin klien dapat secara eksplisit memilih perilaku mana yang sesuai tanpa menurunkan perkiraan. Untuk memastikan bahwa sumber daya dikelola secara konsisten dan penghancuran terjadi sesuai dengan aturan jenis aktual, Anda harus menentukan destruktor virtual publik. Jika hierarki jenis dirancang untuk melarang kode klien untuk menghancurkan objek secara langsung, destruktor harus didefinisikan sebagai non-virtual yang dilindungi.

Keterangan

  • Peringatan muncul pada definisi fungsi virtual pertama dari jenis (dapat menjadi destruktor virtual jika tidak publik), sekali per jenis.

  • Karena definisi dapat ditempatkan secara terpisah dari deklarasi, definisi mungkin tidak selalu memiliki salah satu penentu virtual. Tetapi peringatan masih valid: ini memeriksa 'virtualitas' aktual dari fungsi.

Nama analisis kode: NEED_VIRTUAL_DTOR

Contoh

namespace no_destructor
{
    struct base {
        virtual void foo() {} // C26436, see remarks to understand the placement of the warning.
    };
}

Peringatan tidak muncul ketika kelas dasar memiliki destruktor publik virtual atau destruktor non-virtual yang dilindungi.

namespace virtual_destructor
{
    struct base {
        virtual ~base();
        virtual void foo() {}
    };
}
namespace protected_destructor
{
    struct base {
        virtual void foo() {}
    protected:
        ~base() {}
    };
}