68955

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

Лекция

Информатика, кибернетика и программирование

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

Украинкский

2014-09-28

26.5 KB

0 чел.

Лекція № 17

Тема: Віртуальні деструктори

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

#include<string.h> class TBase

{

private:

char *spl;

public:

TBase(const char *s)

{

spl = strdup(s) ;

}

virtual ~TBase()

{

delete spl;

}

};

class TDerived: public TBase

{

private: char *sp2; public: TDerived(const char*sl, const char *s2):TBase (s1)

{

sp2 = strdup(s2);

}

virtual -TDerived()

{

delete sp2;

} };

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


void main
() {

TBase *pbase;

pbase=new TDerived("String 1","String 2"); delete pbase;

}

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

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


 

А также другие работы, которые могут Вас заинтересовать

72637. DATA 16.89 KB
  В тех случаях, когда переменные нужно присваивать в начале программы какие-либо значения , которые не должны меняться от одного прогона программы к другому, вместо операторов присваивания можно с большей эффективностью воспользоваться оператором DATA.
72638. Оператор PARAMETER 13.2 KB
  С помощью этого оператора можно любой константе дать символьное имя. Этот неисполняемыми оператор должен находиться перед исполняемыми операторами программы. Часто в разных местах программы употребляются длинные константы, такие как 3.14159265.
72640. ОПЕРАТОРЫ ЦИКЛА 20.64 KB
  Операторы цикла предназначены для многократного выполнения некоторых операторов. Эти операторы называются телом цикла. Различаются операторы цикла с предусловием и с постусловием. Блок-схемы операторов цикла показана на рисунке 1.2.
72641. Структурный IF 21.71 KB
  Сначала вычисляется условие e, а затем в зависимости от его истинности выполняется на выбор один из двух блоков, а после этого - следующий оператор. Один оператор if можно вкладывать в другой оператор IF. Один из таких случаев вложения, а именно if в блок НЕТ другого IF допускает...
72642. ЛОГИЧЕСКИЕ ВЫРАЖЕНИЯ 14.43 KB
  Логическими данными могут быть не только переменные и константы логического типа. Данные или выражения любого встроенного типа связанные операцией логического отношения образуют конструкцию логического типа. Такие конструкции могут входить в логические выражения наравне с логическими переменными и константами.
72643. Условные операторы 23.83 KB
  Условные операторы позволяют выбирать одно из нескольких возможных продолжений процесса программы. Имеется несколько форм условных операторов, из которых самым мощным и простым является структурный оператор IF.
72644. Последовательность выполнения операторов в программной единице 12 KB
  Главная программа является ведущей программной единицей, и обработка всей программы всегда начинается с первого исполняемого оператора главной программы. Обычно главную программу располагают в начале всей программы, т.к. этого требуют некоторые компиляторы; за главной программой следуют подпрограммы.
72645. Последовательность выполнения операторов в программной единице 12.99 KB
  Любая программная единица представляет собой последовательность операторов и комментариев. Комментарии могут располагаться в любом месте программной единицы. Они не влияют на ход выполнения программы. Порядок следования операторов в программе существен.