PDA

View Full Version : سوال: برای چه منظوری ما مخرب رو از نوع virtual تعریف میکنیم؟



saleh.hi.62
سه شنبه 01 تیر 1389, 07:06 صبح
برای چه منظوری ما مخرب رو از نوع virtual تعریف میکنیم؟



class test {
public:
test();
virtual ~test();
};

حامد مصافی
سه شنبه 01 تیر 1389, 07:48 صبح
فرض كنيد مخرب كلاس شما virtual نيست و كلاسي با نام A از اين كلاس فرشي شما مشتق شده باشد:


class A: public test
{
public:
A(){ /* set variables here */ }
~A(){ /* free memory here */ }
};حال من اگر كدي مانند زير براي تعريف يك شي بنويسم:


test *obj = new A();
delete obj;در دستور delete ابتدا متد مخرب كلاس پايه (test) فراخواني مي شود، سپس متد مخرب كلاس مشتق شده (A) اما obj قبلاً نابود شده است، لذا اگر قرار باشد منبعي در مخرب كلاس A آزاد شود، اين اتفاق نمي افتد و ممكن است برنامه شما دچار نشت حافظه شود. براي گريز از اين معضل مخرب كلاس پايه بايد virtual باشد، در اين صورت مخرب كلاس مشتق شده (A) اجرا خواهد شد و پس از آن مخرب كلاس پايه (test) يعني درست همانطور كه بايد باشد، پس سعي كنيد هميشه در كلاس هاي پايه مخرب را virtual قيد كنيد.