17.5.5. Виртуальные деструкторы

17.5.5. Виртуальные деструкторы

В данной функции мы применяем оператор delete:

void doit_and_bedone( vector Query* *pvec )

{

// ...

for ( ; it != end_it; ++it )

{

Query *pq = *it;

// ...

delete pq;

}

}

Чтобы функция выполнялась правильно, применение delete должно вызывать деструктор того класса, на который указывает pq. Следовательно, необходимо объявить деструктор Query виртуальным:

class Query {

public:

virtual ~Query() { delete _solution; }

// ...

};

Деструкторы всех производных от Query классов автоматически считаются виртуальными. doit_and_bedone() выполняется правильно.

Поведение деструктора при наследовании таково: сначала вызывается деструктор производного класса, в случае pq - виртуальная функция. По завершении вызывается деструктор непосредственного базового класса - статически. Если деструктор объявлен встроенным, то в точке вызова производится подстановка. Например, если pq указывает на объект класса AndQuery, то

delete pq;

приводит к вызову деструктора класса AndQuery за счет механизма виртуализации. После этого статически вызывается деструктор BinaryObject, а затем - снова статически - деструктор Query.

В следующей иерархии классов

class Query {

public: // ...

protected:

virtual ~Query();

// ...

};

class NotQuery : public Query {

public:

~NotQuery();

// ...

};

уровень доступа к конструктору NotQuery открытый при вызове через объект NotQuery, но защищенный - при вызове через указатель или ссылку на объект Query. Таким образом, виртуальная функция подразумевает уровень доступа того класса, через объект которого вызывается:

int main()

{

Query *pq = new NotQuery;

// ошибка: деструктор является защищенным

delete pq;

}

Эвристическое правило: если в корневом базовом классе иерархии объявлены одна или несколько виртуальных функций, рекомендуем объявлять таковым и деструктор. Однако, в отличие от конструктора базового класса, его деструктор не стоит делать защищенным.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

5.5 Конструкторы и Деструкторы

Из книги C++ автора Хилл Мюррей

5.5 Конструкторы и Деструкторы Если у класса есть конструктор, то он вызывается всегда, когда создается объект класса. Если у класса есть деструктор, то он вызывается всегда, когда объект класса уничтожается. Объекты могут создаваться как:1. Автоматический объект:


7.2.6 Конструкторы и Деструкторы

Из книги Информатика и информационные технологии: конспект лекций автора Цветкова А В

7.2.6 Конструкторы и Деструкторы Для некоторых производных классов нужны конструкторы. Если у базового класса есть конструктор, он должен вызыватся, и если для этого конструктора нужны параметры, их надо предоставить. Например:class base (* // ... public: base(char* n, short t); ~base(); *);class derived :


8.5.7 Деструкторы

Из книги Информатика и информационные технологии автора Цветкова А В

8.5.7 Деструкторы Функция член класса cl с именем ~cl называется деструтором. Деструктор не возвращает никакого значения и не полчает никаких параметров; он используется для уничтожения знчений типа cl непосредственно перед уничтожением содержащего их объекта. Деструктор не


2. Конструкторы и деструкторы

Из книги Справочное руководство по C++ автора Страустрап Бьярн

2. Конструкторы и деструкторы Конструкторы и деструкторы являются специализированными формами методов. Используемые в связи с расширенным синтаксисом стандартных процедур New и Dispose конструкторы и деструкторы обладают способностью размещения и удаления динамических


3. Деструкторы

Из книги Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT автора Фролов Александр Вячеславович

3. Деструкторы Borland Pascal предоставляет специальный тип метода, называемый сборщиком мусора (или деструктором) для очистки и удаления динамически размещенного объекта. Деструктор объединяет шаг удаления объекта с какими-либо другими действиями или задачами, необходимыми


30. Конструкторы и деструкторы

Из книги Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ автора Мейерс Скотт

30. Конструкторы и деструкторы Конструкторы и деструкторы являются специализированными формами методов. Используемые в связи с расширенным синтаксисом стандартных процедур New и Dispose конструкторы и деструкторы обладают способностью размещения и удаления динамических


31. Деструкторы

Из книги Стандарты программирования на С++. 101 правило и рекомендация автора Александреску Андрей

31. Деструкторы Borland Pascal предоставляет специальный тип метода, называемый сборщиком мусора (или деструктором) для очистки и удаления динамически размещенного объекта. Деструктор объединяет шаг удаления объекта с какими-либо другими действиями или задачами, необходимыми


R.12.4 Деструкторы

Из книги C++ для начинающих автора Липпман Стенли

R.12.4 Деструкторы Деструктором называется функция-член класса cl с именем ~cl, она используется для уничтожения значений типа cl непосредственно перед уничтожением объекта, содержащего их. Деструктор не имеет формальных параметров и для него нельзя задать тип возвращаемого


R.15.3 Конструкторы и деструкторы

Из книги автора

R.15.3 Конструкторы и деструкторы Когда управление передается из точки запуска особой ситуации обработчику, то вызываются деструкторы для всех автоматических объектов, построенных с момента входа в проверяемый-блок.Если объект не был построен полностью, то деструкторы


Конструкторы и деструкторы класса

Из книги автора

Конструкторы и деструкторы класса Обычно при создании объекта класса необходимо провести начальную инициализацию объекта, например выделить участок памяти для размещения каких-либо данных, связанных с этим объектом. После окончания использования объекта выделенную


Глава 2 Конструкторы, деструкторы и операторы присваивания

Из книги автора

Глава 2 Конструкторы, деструкторы и операторы присваивания Почти во всех ваших классах будут определены один или несколько конструкторов, деструктор и оператор присваивания. Это функции, которые отвечают за операции создания и инициализации объекта, его уничтожения, а


Правило 8: Не позволяйте исключениям покидать деструкторы

Из книги автора

Правило 8: Не позволяйте исключениям покидать деструкторы C++ не запрещает использовать исключения в деструкторах, но это, безусловно, очень нежелательная практика. На то есть серьезная причина. Рассмотрим пример:class Widget {public:...~Widget() {...} // предположим, здесь есть


Конструкторы, деструкторы и копирование

Из книги автора

Конструкторы, деструкторы и копирование Если стандарт привел вас к обрыву, это еще не значит, что вы должны прыгнуть с него. — Норман Даймонд (Norman Diamond) О Большой Четверке специальных функций было сказано достаточно, чтобы вы не удивлялись тому, что им посвящен отдельный


17.4.5. Деструкторы

Из книги автора

17.4.5. Деструкторы Когда заканчивается время жизни объекта производного класса, автоматически вызываются деструкторы производного и базового классов (если они определены), а также деструкторы всех объектов-членов. Например, если имеется объект класса NameQuery:NameQuery nq( "hyperion"


17.5.8. Виртуальные функции, конструкторы и деструкторы

Из книги автора

17.5.8. Виртуальные функции, конструкторы и деструкторы Как мы видели в разделе 17.4, для объекта производного класса сначала вызывается конструктор базового, а затем производного класса. Например, при таком определении объекта NameQueryNameQuery poet( "Orlen" );сначала будет вызван