kzhereb / knu-is-ooop2019

Materials for "Fundamentals of OOP" course
MIT License
3 stars 0 forks source link

T10.59. Чи бувають віртуальні деструктори? Чому? #59

Open yanaskyrda opened 4 years ago

WAG13 commented 4 years ago

Так Зазвичай віруальний деструктор оголошується тільки в базовому класі, в усіх успадкованих класах деструктор буде віртуальним за замовчуванням. Віртуальний деструктор гарантує, що всі необхідні деструктори для об'єкта такого класу будуть викликані, яким би чином ти не викликав для нього delete.

AntonHladkiy commented 4 years ago

Так , такий деструктор задається в базовому класі.такий деструктор гарантує що відбудеться видалення не тільки базового класу а і наслідуваних.

MarinaMontag commented 4 years ago

Віртуальні функції (і деструктор зокрема) в С ++ потрібні для того, щоб викликати перевантажений в класі-нащадку варіант відповідної функції через вказівник на базовий клас. Стосовно деструкторами це означає, що об'єкт класу-нащадка D можна коректно видалити, маючи покажчик на базовий клас B: class B { public: virtual ~B() {} }; ... class D : public B { public: ~D() {} } ... B * pObj = new D; ... delete pObj; // - як би не virtual ~B(), ~D() не визвався б.

RostyslavMV commented 4 years ago

Так, віртуальні деструктори задаються в базовому класі, вони гарантують, що відбудеться видалення не тільки базового класу, а й усіх від нього наслідуваних.

i1red commented 4 years ago

Так. Якщо деструктор базового класу не є virtual, то за умови роботи через покажчик на базовий клас при знищенні об'єкта буде викликано тільки деструктор базового класу. virtual вирішує цю проблему

tanyakurdelchuk commented 4 years ago

Якщо базовий клас призначений для поліморфного використання, то його деструктор повинен оголошуватися віртуальним. Для реалізації механізму віртуальних функцій кожен об'єкт класу зберігає вказівник на таблицю віртуальних функцій vptr, що збільшує його загальний розмір. Зазвичай, при оголошенні віртуального деструктора такий клас вже має віртуальні функції, і збільшення розміру відповідного об'єкта не відбувається. Якщо ж базовий клас не призначений для поліморфного використання (не містить віртуальних функцій), то його деструктор не повинен оголошуватися віртуальним.

ilyakorenevskyi commented 4 years ago

Так ,без virtual не буде визвано деструктори классів наслідників

Beam-of-Light commented 4 years ago

Бувають, зазвичай тільки в базовому класі. За допомогою нього гарантовано викликаються деструктори класів наслідників.