Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in /home/studb20/public_html/index.php on line 4
 2.7.4 Віртуальні деструктори - Програмування С, С++теорія та практика (частина 2) - Studbook

Програмування С, С++теорія та практика (частина 2)

2.7.4 Віртуальні деструктори

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

#іпс1ийе<з'Ьгіпд.Ь> с1азз ТВазе {

рг^а^е:

сЬаг *зр1; риЬ1іс:

ТВазе(сопз£ сЬаг *з)

{

зр1=з^гйир(з);

}

^г'Ьиа1 ~ТВазе()

{

Йе1е£е зр1;

}

};

с1азз ТБегі^ей: риЬ1іс ТВазе {

рг^а^е:

сЬаг *зр2; риЬ1іс:

ТБегі^ей(сопз'Ь сЬаг*з1, сопз£ сЬаг *з2) :ТВазе (зі)

{

зр2=з'Ьгйир(з2);

}

^г'Ьиа1 ~ТБегі^ей ()

{

Йе1е£е зр2;

}

};

У головній програмі організуємо демонстрацію створення та знищення об'єкту похідного класу ТБетегі:

VОій. таіп ()

{

ТВазе *рЬазе;

рЬазе=пем ТБегі^ей.("8'Ьгіпд 1","8'Ьгіпд 2"); йе1е£е рЬазе;

}

Проведемо деяке додаткове спостереження даного коду та зробимо деструктор на деякий час звичайним, невіртуальним. Тоді останнім оператором головної програми при видаленні об'єкта через покажчик базового класу було б викликано лише деструктор базового класу, залишивши у динамічній пам'яті незвільнений рядок у вигляді хр2. Ця проблема розв'язується оголошенням віртуальних деструкторів: гарантовано, що у разі, коли знищується об'єкт класу ТБетегі, адресований покажчиком на ТВазе, буде знищено обидва рядки.

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

 

37