Це говорить про те. Що деструкція для Derv не викликається взагалі! До такого результату привело те, що деструкція базового класу в приведеному лістингу невіртуальна. Виправити це можна, закоментувавши першу стрічку визначення деструкції і активізувавши другу. Тепер результатом роботи програми є:
Derv видалений
Base видалений
Тільки тепер обидві частини об’єкту породженого класу видалено коректно. Звичайно, якщо жодна з деструкцій нічого особливо важливого не робить (наприклад, просто звільняє пам’ять, зайняту за допомогою new), тоді їх віртуальність перестає бути такою вже необхідною. Але в загальному випадку, щоб бути упевненим в тому, що об’єкти породжених класів видаляються так, як потрібно, слід завжди робити деструкції в базових класах віртуальними.
Більшість бібліотек класів мають базовий клас, в якому є віртуальна деструкція, що гарантує нам наявність віртуальних деструкцій в породжених класах.
|