destruktor virtual
Dalam C++, konstruktor tidak dapat didefinisikan sebagai konstruktor fiktif, karena konstruktor dipanggil hanya ketika suatu objek dipakai, dan implementasi fungsi virtual sebenarnya dipanggil melalui penunjuk tabel fungsi virtual, dan tidak ada pembaruan objek tentu saja tidak dapat dipanggil tanpa ruang memori, sehingga konstruktor fiktif sebelum membuat instance suatu objek tidak ada artinya dan tidak dapat diimplementasikan.
Namun, destruktor dapat berupa fungsi virtual, dan sering kali dideklarasikan sebagai destruktor virtual. Dengan cara ini, ketika objek dari kelas turunan yang ditunjuk oleh penunjuk kelas dasar dilepaskan, destruktor subkelas dapat dikompilasi secara dinamis dan dipanggil sesuai dengan tipe objek sebenarnya yang ditunjuk, untuk mencapai pelepasan memori objek yang benar. .
Mari kita lakukan percobaan dibawah ini, silahkan lihat kodenya :
/***************************************//Des: Demo tutorial C++ //Penulis: Huang/ /Hak Cipta:www.dotcpp.com//Tanggal:27/12/2017************************************ * *******/#include<iostream>usingnamespacestd;classPoint{private:intx,y;int*str;public:Point(intx=0,inty=0){ini->x=x;ini- > y=y;str=newint[100];}~Point(){delete[]str;cout<<CalledPoint'sDestructorandDeletedstr!<<endl;}};classCircle:publicPoint{private:intr;int*str;public : Lingkaran(intx,inty,intR):Point(x,y){r=R;str=newint[100];}~Circle(){delete[]str;cout<<CalledCircle'sDestructorandDeletedstr!<<endl; } };intmain(){Titik*p;p=newCircle(10,10,20);deletep;return0;}
Anda dapat melihat kodenya. Tidak ada destruktor yang dideklarasikan dengan virtual di kelas dasar, dan kelas dasar dan kelas turunan memiliki alokasi memori dinamis. Kemudian kita membuat kelas Lingkaran di fungsi utama dengan mengalokasikan memori secara dinamis, dan kemudian menghapus itu. Tangkapan layar setelah dijalankan adalah sebagai berikut:
Terlihat jelas bahwa hanya destruktor kelas dasar yang dipanggil, sehingga memori baru sebesar 4*100 byte di kelas turunan akan tetap ada, menyebabkan kebocoran memori!
Dan jika destruktor di kelas dasar dideklarasikan sebagai virtual, hasilnya akan sangat berbeda! Pada saat ini, efek polimorfik muncul. Pertama-tama akan melepaskan ruang kelas turunan, dan kemudian melepaskan ruang memori kelas dasar. Ini berakhir dengan sempurna, seperti yang ditunjukkan di bawah ini:
Di atas, inilah manfaat yang dibawa oleh destructor virtual, Anda bisa merasakannya sendiri.