Ketika mengganti kelas di C ++ (dengan destruktor virtual) saya mengimplementasikan destruktor lagi sebagai virtual pada kelas pewarisan, tetapi apakah saya perlu memanggil destruktor basis?
Kalau begitu saya bayangkan itu seperti ini ...
MyChildClass::~MyChildClass() // virtual in header
{
// Call to base destructor...
this->MyBaseClass::~MyBaseClass();
// Some destructing specific to MyChildClass
}
Apakah saya benar?
c++
destructor
Nick Bolton
sumber
sumber
delete
pointer ke kelas dasar dua kali tidak menyebabkan kesalahan segmentasi?Tidak, Anda tidak perlu memanggil destruktor basis, destruktor basis selalu dipanggil untuk Anda oleh destruktor yang diturunkan. Silakan lihat jawaban terkait saya di sini untuk urutan kehancuran .
Untuk memahami mengapa Anda menginginkan destruktor virtual di kelas dasar, silakan lihat kode di bawah ini:
Saat kamu melakukan:
Maka jika Anda tidak memiliki destruktor virtual di B, hanya ~ B () yang akan dipanggil. Tetapi karena Anda memiliki destruktor virtual, pertama ~ D () akan dipanggil, kemudian ~ B ().
sumber
Apa yang orang lain katakan, tetapi juga perhatikan bahwa Anda tidak harus mendeklarasikan virtual destructor di kelas turunan. Setelah Anda mendeklarasikan virtual destruktor, seperti yang Anda lakukan di kelas dasar, semua destruktor yang diturunkan akan menjadi virtual apakah Anda menyatakan demikian atau tidak. Dengan kata lain:
sumber
Tidak seperti metode virtual lainnya, di mana Anda akan secara eksplisit memanggil metode Basis dari Turun ke 'rantai' panggilan, kompiler menghasilkan kode untuk memanggil destruktor dalam urutan terbalik di mana konstruktor mereka dipanggil.
sumber
Tidak, Anda tidak pernah memanggil destruktor kelas dasar, selalu dipanggil secara otomatis seperti yang ditunjukkan orang lain, tetapi di sini ada bukti konsep dengan hasil:
Outputnya adalah:
Jika Anda menetapkan destruktor kelas dasar sebagai virtual mana yang harus, maka hasil huruf 3 akan sama dengan kasus 1 & 2.
sumber
Tidak. Secara otomatis dipanggil.
sumber
Destructors di C ++ secara otomatis dipanggil sesuai urutan konstruksinya (Berasal dari Base) hanya ketika destructor kelas Base dideklarasikan
virtual
.Jika tidak, maka hanya destruktor kelas dasar yang dipanggil pada saat penghapusan objek.
Contoh: Tanpa Destructor virtual
Keluaran
Contoh: Dengan Basis Destructor virtual
Keluaran
Direkomendasikan untuk mendeklarasikan destruktor kelas dasar karena
virtual
jika tidak, akan menyebabkan perilaku yang tidak terdefinisi.Referensi: Destructor Virtual
sumber