Avatar ·

متى يجب استخدام المدمرات الافتراضية في لغة C++ وماذا سيحدث إذا لم يتم تعريفها؟

```html مرحباً بالجميع! بدأت للتو في تعلم لغة ++C ولا أستطيع فهم شيء واحد. انظر: لديّ كلاس أساسي `Base` وكلاس وارث `Derived`. في `Derived` أقوم بتخصيص ذاكرة في الكومة. عندما أقوم بإنشاء كائن عبر مؤشر للكلاس الأساسي ثم أحذفه باستخدام `delete`، يتم استدعاء مدمر `Base` فقط، وليس مدمر `Derived`. هذا يؤدي إلى تسرب الذاكرة، لأن الذاكرة المخصصة في الكلاس الوارث لا يتم تحريرها. أعلم أنه يجب إضافة `virtual` قبل المدمر في الكلاس الأساسي، وعندها يعمل كل شيء بشكل صحيح. لكن لماذا يحدث هذا؟ ألم أكتب كوداً يجب أن يستدعي مدمر الكلاس الوارث؟ أم أنني أخلط بين الأمور؟ هذا مثال على الكود الذي لا يعمل لدي (أو بالأحرى يعمل، لكن مع تسرب للذاكرة): ```cpp class Base { public: ~Base() { std::cout << "Base destructor\n"; } }; class Derived : public Base { private: int* data; public: Derived() { data = new int[100]; } ~Derived() { delete[] data; std::cou ```