الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

virtual destructors

مغلق
بدأه H@mis في 15 نوفمبر 2005 · 6 رد · 855 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

لو عندنا كود زي ده

#include<iostream>
using namespace std;

class base
{
	base();
	~base(){blah blah blah}
}
class deriven:base
{
	deriven();
	virtual ~deriven(){blah blah blah}
}

الدكتور في الكلية عندنا بيقول ان احنا حطينا virtual قبل ال destructor في ال derived class

لأننا عايزينه يتنفذ الأول قبل ال destructor بتاع ال base

فقلتله ان الطبيعي في الكومبيلنج ان ال destructor بتاع ال driven هو اللى بيتنفذ الأول وبعدين ال base

فقال ان وجهة نظري سليمة وطلب منى اعرف ايه الفرق مابين الحالةاللى انا حاطاها دي واني اشيل كلمة virtual

نا ان شاء الله لسه ببحث عن الإجابة وقلت اشاركوا السؤال للأستفادة من وجهات النظر

وسوري لو كنت طولت عليكوا :rolleyes:

تم تعديل هذه المشاركة بواسطة H@mis في 16 نوفمبر 2005 في 02:00

#2

هممم .. موضوع لم انتبه له من قبل.

بعد بحث سريع في جووجل عن virtual destructor تبين انه لو كان عندنا الوضع:

class Base
{
public:
        Base() {}
        ~Base() { cout << "Base destructor called" << endl; }
}

class Sub : Base
{
public:
        Sub() {}
        ~Sub() { cout << "Sub desctuctor called" << endl; }
}

فإن هذا الكود:

Base * p = new Sub();
//.....
delete p;

لن تقوم باستدعاء الـ destructor الخاص بـ Sub, مع ان p هو في الحقيقة نموذج عن Sub! رغم انه مؤشر الى Base.

الظاهر انه يمكن حل هذه المشكلة باستخدام virtual امام الـ desctructor الخاص بـ Base

class Base
{
public:
        Base() {}
        virtual  ~Base() { cout << "Base destructor called" << endl; }
}

class Sub : Base
{
public:
        Sub() {}
        virtual  ~Sub() { cout << "Sub desctuctor called" << endl; }
}

لم اجرب هذا الكلام, و لكن المصدر هو http://www.devx.com/tips/Tip/13509

تم تعديل هذه المشاركة بواسطة hasan_aljudy في 15 نوفمبر 2005 في 23:33

#3

فعلا زى ما الاخ حسان قال أفترض لو عندى base class لازم يكون الdestructor بتاع الbase class يكون virtual

لية؟؟؟؟؟؟؟؟؟

أقترض أن انا هستخدم delete لعمل

delete for bases class pointer to derived class to destroy derived class

لو كان الdestructor of the base class isnt virtual هيكون زى أى دالة عادية بمعنى سيتم إستدعاء الbase destructor ولا يتم إستدعاء أيضا الderived destructor كما فى ذلك الكود

#include <iostream>
#include <conio>

class Base
{
 public:
      ~Base()
          { cout<<"Base Destroyed"<<endl; }
};
class Dev: public Base
{
 public:
      ~Dev()
           { cout<<"Dev Destroyed"<<endl; }
};
void main()
{
 Base* ptr = new Dev; //in this line will call the base destructor as shown in the output
 delete ptr;
 getch();
}

أما لو حطيت virtual قبل الbase destructor هيؤدى الى مناداة الderived class first then base class

أعتقد أن الدكتور أتلخبط :wacko:

وكذلك أحب أذكركم أن أيضا الvirtual keyword لحل مشكلة الambiguity multi Inheritance

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#4

في الحقيقة اخذت هذا من عام تقريبا وقد نسيت معظمه ولكن

قد يفيد مرجع dettill && dettil

#5
اقتباس
فقلتله ان الطبيعي في الكومبيلنج ان ال destructor بتاع ال driven هو اللى بيتنفذ الأول وبعدين ال base

دا فى حالة ان ان واخد object من الderiven class وليس bases class pointer to derived class

مع العلم لو خليت الderived destructor is virtual برضة ف تلك الحالة سيتم مناداة الbase destructor

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#6

وهنا شرح بسيط للvirtual function

vitual function

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#7

الأخ eng_3llam والأخ hasan_aljudy

شكرا جدا على مجهدكوا وفعلا كلامكوا صحيح

واسفة جدا علىالتاخير في الرد اصل كان عندي امتحانات ونسيت الموضوع خالص :)

هذا الموضوع مغلق.

مواضيع مشابهة