отать правильно. Чтобы разобра
Автор admin Суббота, 20 июня 2009 11:32
отать правильно. Чтобы разобраться в происходящем, рассмотрим код main(). При заполнении vector shapes используются вызовы «виртуального конструктора» Shape. Обычно в подобных ситуациях конструктор вызывается для фактического типа, и в объекте устанавливается VPTR для этого типа. Но здесь во всех случаях будет использоваться VPTR для Shape, а не для специализированных классов Circle, Square и Triangle. В цикле for, где для каждого объекта Shape вызываются функции draw() и erase(), вызов виртуальной функции через VPTR направляется соответствующему типу. Тем не менее, во всех случаях это будет тип Shape. Может возникнуть вопрос: зачем же функции draw() и erase() объявлены виртуальными? Ответ на него проясняется на следующем шаге: версия draw() базового класса через указатель s на «письмо» вызывает виртуальную функцию draw() для «письма». На этот раз вызов направляется фактическому типу объекта, а не базовому классу Shape. Таким образом, за применение виртуальных деструкторов приходится расплачиваться дополнительным уровнем косвенности при каждом вызове виртуальной функции. Чтобы создать любую переопределя
Комментарии закрыты.
Последние комментарии