компилятор создает объекты об

Автор admin Суббота, 20 июня 2009 11:32

компилятор создает объекты общего типа Shape, хотя конструктор инициализирует указатель конкретным подтипом Shape. Механизм виртуального вызова используется, но VPTR в объекте Shape указывает на таблицу виртуальных функций Shape, а не Square. В результате будет вызван деструктор Shape, который вызывает delete для указателя s в «письме», фактически ссылающегося на объект Square. Вызов также является виртуальным, но на этот раз он разрешается в деструктор Square. С++ на уровне компилятора гарантирует вызов всех деструкторов в иерархии. Сначала вызывается деструктор Square, за которым по порядку вызываются все промежуточные деструкторы вплоть до деструктора базового класса. В деструкторе базового класса содержится команда delete s. Первоначальный вызов деструктора относился к указателю s «конверта», но теперь он относится к указателю s «письма», который присутствует только потому, что «письмо» наследует от «конверта», а не потому, что он содержит полезную информацию. Следовательно, этот вызов delete делать ничего не должен. Проблема решается обнулением указателя s в «письме». Теперь при вызове деструктора


Комментарии закрыты.