المدمرة الافتراضية
في C++، لا يمكن تعريف المُنشئ على أنه مُنشئ وهمي، لأنه يتم استدعاء المُنشئ فقط عند إنشاء كائن، ويتم استدعاء تنفيذ الوظيفة الافتراضية فعليًا من خلال مؤشر جدول الوظائف الظاهري، ولا يوجد تحديث للكائن بالطبع لا يمكن استدعاؤه بدون مساحة ذاكرة، لذا فإن المُنشئ الوهمي قبل إنشاء كائن لا معنى له ولا يمكن تنفيذه.
ومع ذلك، يمكن أن تكون أدوات التدمير وظائف افتراضية، وفي معظم الأحيان يتم الإعلان عنها كأدوات تدمير افتراضية. بهذه الطريقة، عندما يتم تحرير كائن الفئة المشتقة المشار إليه بواسطة مؤشر الفئة الأساسية، يمكن تجميع مدمر الفئة الفرعية ديناميكيًا واستدعائه وفقًا لنوع الكائن الفعلي المشار إليه، وذلك لتحقيق تحرير ذاكرة الكائن الصحيح .
لنجري تجربة أدناه، يرجى إلقاء نظرة على الكود:
/***************************: /حقوق النشر: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];}~Point(){delete[]str;cout<<CalledPoint'sDestructorandDeletedstr!<<endl;}};classCircle:publicPoint{private:intr;int*str;public : Circle(intx,inty,intR):Point(x,y){r=R;str=newint[100];}~Circle(){delete[]str;cout<<CalledCircle'sDestructorandDeletedstr!<<endl; } };intmain(){Point*p;p=newCircle(10,10,20);deletep;return0;}
يمكنك رؤية الكود، ولم يتم الإعلان عن أداة تدمير افتراضية في الفئة الأساسية، وكل من الفئة الأساسية والفئة المشتقة لهما تخصيص ديناميكي للذاكرة. ثم نقوم بإنشاء فئة الدائرة في الوظيفة الرئيسية عن طريق تخصيص الذاكرة ديناميكيًا، ثم نحذفها لقطة الشاشة بعد التشغيل هي كما يلي:
يمكن أن نرى بوضوح أنه يتم استدعاء مدمر الفئة الأساسية فقط، بحيث تبقى 4*100 بايت من الذاكرة الجديدة في الفئة المشتقة، مما يتسبب في تسرب الذاكرة!
وإذا تم الإعلان عن المدمر الموجود في الفئة الأساسية باعتباره افتراضيًا، فستكون النتيجة مختلفة تمامًا! في هذا الوقت، يظهر التأثير متعدد الأشكال، وسيقوم أولاً بتحرير مساحة الفئة المشتقة، ثم تحرير مساحة الذاكرة الخاصة بالفئة الأساسية، وينتهي تمامًا، كما هو موضح أدناه:
أعلاه، هذه هي الفوائد التي يقدمها المدمر الافتراضي، يمكنك تجربتها بنفسك.