Destructor virtual berguna ketika Anda berpotensi menghapus instance kelas turunan melalui pointer ke kelas dasar:
class Base
{
// some virtual methods
};
class Derived : public Base
{
~Derived()
{
// Do some important cleanup
}
};
Di sini, Anda akan melihat bahwa saya tidak menyatakan destructor Base sebagai virtual
. Sekarang, mari kita lihat cuplikan berikut:
Base *b = new Derived();
// use b
delete b; // Here's the problem!
Sejak destructor Basis adalah tidak virtual
dan b
adalah Base*
menunjuk ke Derived
objek, delete b
memiliki perilaku tidak terdefinisi :
[Dalam delete b
], jika tipe statis objek yang akan dihapus berbeda dari tipe dinamisnya, tipe statis akan menjadi kelas dasar dari tipe dinamis objek yang akan dihapus dan tipe statis harus memiliki destruktor virtual atau perilaku tidak terdefinisi .
Dalam sebagian besar implementasi, panggilan ke destruktor akan diselesaikan seperti kode non-virtual, yang berarti bahwa destruktor dari kelas dasar akan dipanggil tetapi bukan kelas turunan, yang mengakibatkan kebocoran sumber daya.
Singkatnya, selalu membuat destruktor kelas dasar virtual
ketika mereka dimaksudkan untuk dimanipulasi secara polimorfis.
Jika Anda ingin mencegah penghapusan instance melalui pointer kelas dasar, Anda bisa membuat destruktor kelas dasar dilindungi dan nonvirtual; dengan melakukannya, kompiler tidak akan membiarkan Anda memanggil delete
pointer kelas dasar.
Anda dapat mempelajari lebih lanjut tentang virtualitas dan penghancur kelas dasar virtual dalam artikel ini dari Herb Sutter .