Здравствуйте, WFrag, Вы писали:
WF>Гон. Вот тупое опровержение (все VC, до которых дотянулись руки — VC6.0, VC7.0, VC7.1):
WF>WF>#include <iostream>
WF>struct A
WF>{
WF> virtual ~A() { } // Типа не портим объект явно.
WF> virtual void func() = 0;
WF>};
WF>struct B : public A
WF>{
WF> virtual void func() { std::cout << "Yo!" << std::endl; }
WF>};
WF>int main()
WF>{
WF> A& a = B();
WF> a.~A(); // Деструктор типа нифига не делает, объекту все параллельно. ;)
WF> a.func(); // Ооопс. А вот и нет!
WF>}
WF>
Прекрасный пример. Однако замечу, что неприятность возникла при использовании ВИРТУАЛЬНОЙ функции. И связана с тем, что для большинства платформ (не берусь утверждать что для всех) деструктор любого объекта, использующего виртуальные функции является не тривиальным (см. письмо от leper). Что этот пример и подтверждает прекрасно. Однако это уже особенности трансляторов (которые играются с таблицами виртуальных функций), а не требование стандарта.
MIH>>> Теперь об операторе delete. Он отличается тем, что делает два действия — вызывает деструктор и затем — освобождает память, выделнную под переменные объекта (впрочем оговорюсь, что delete может быть переопределён и делать что-то иное).
WF>Оператор delete переопределен не может быть. Может быть переопределена функция (ее еще иногда называеют операторной функцией) delete. Оператор delete делает всегда одну и ту же последовательность действий — вызов деструктора, вызов соответствующей операторной функции. Вроде так.
А вот это святая правда. Каюсь. Оператор delete действительно не может быть переопеределён и действительно последовательнось вызовов так же фиксирована. Тут я выразился весьма коряво...