ตัวทำลายเสมือน
ในภาษา C++ ตัวสร้างไม่สามารถกำหนดเป็นตัวสร้างสมมติได้ เนื่องจาก ตัวสร้าง จะถูกเรียกเฉพาะเมื่อมีการสร้างอินสแตนซ์ของวัตถุ และการใช้งานฟังก์ชันเสมือนจะถูกเรียกผ่านตัวชี้ตารางฟังก์ชันเสมือน และไม่มีการอัพเดตวัตถุของ แน่นอนว่าไม่สามารถเรียกได้หากไม่มีพื้นที่หน่วยความจำ ดังนั้น Constructor ที่สมมติขึ้น ก่อนที่จะสร้างอินสแตนซ์ของวัตถุจึงไม่มีความหมายและไม่สามารถนำมาใช้ได้
อย่างไรก็ตาม ตัวทำลาย สามารถเป็นฟังก์ชันเสมือนได้ และโดยส่วนใหญ่แล้วพวกมันจะถูกประกาศให้เป็นตัวทำลายเสมือน ด้วยวิธีนี้ เมื่ออ็อบเจ็กต์ของคลาสที่ได้รับซึ่งชี้โดยตัวชี้คลาสพื้นฐานถูกปล่อยออกมา ตัวทำลายล้างของคลาสย่อยสามารถคอมไพล์และเรียกแบบไดนามิกตามประเภทอ็อบเจ็กต์จริงที่ชี้ไป เพื่อให้ได้การปล่อยหน่วยความจำอ็อบเจ็กต์ที่ถูกต้อง .
มาทำการทดลองด้านล่างกัน โปรดดูโค้ด:
/************************************//Des: การสาธิตการสอน C++//Author: Huang/ /ลิขสิทธิ์:www.dotcpp.com//วันที่:2017/12/27********************************* * ******* /#include<iostream>usingnamespacestd;classPoint{private:intx,y;int*str;public:Point(intx=0,inty=0){this->x=x;this->y=y;str=newint [100];}~จุด(){ลบ e[]str;cout<<CalledPoint'sDestructorandDeletedstr!<<endl;}};classCircle:publicPoint{private:intr;int*str;public:Circle(intx,inty,intR):Point(x,y){r =ร; str=newint[100];}~Circle(){ลบ[]str;cout<<CalledCircle'sDestructorandDeletedstr!<<endl;}};intmain(){Point*p;p=newCircle(10,10,20) ;ลบ;กลับ0;}
คุณสามารถดูโค้ดได้ ไม่มี destructor ที่ประกาศด้วย virtual ในคลาสพื้นฐาน และทั้งคลาสพื้นฐานและคลาสที่ได้รับมีการจัดสรรหน่วยความจำแบบไดนามิก จากนั้น เราจะสร้างคลาส Circle ในฟังก์ชันหลักโดยการจัดสรรหน่วยความจำแบบไดนามิก จากนั้นจึงลบออก ภาพหน้าจอหลังจากการรันมีดังนี้:
จะเห็นได้อย่างชัดเจนว่ามีเพียง destructor ของคลาสพื้นฐานเท่านั้นที่ถูกเรียก ดังนั้นหน่วยความจำใหม่ขนาด 4*100 ไบต์ในคลาสที่ได้รับจะยังคงอยู่ ทำให้หน่วยความจำรั่ว!
และหาก destructor ในคลาสพื้นฐานถูกประกาศให้เป็น virtual ผลลัพธ์จะแตกต่างออกไปมาก! ในเวลานี้ เอฟเฟกต์โพลีมอร์ฟิคจะปรากฏขึ้น ขั้นแรกจะปล่อยพื้นที่ของคลาสที่ได้รับ จากนั้นจึงปล่อยพื้นที่หน่วยความจำของคลาสพื้นฐาน ซึ่งจะสิ้นสุดอย่างสมบูรณ์ ดังที่แสดงด้านล่าง:
ข้างต้นนี้คือคุณประโยชน์ที่ตัวทำลายเสมือนนำมาซึ่งคุณสามารถสัมผัสได้ด้วยตัวเอง