емую функцию (такую как draw()
Автор admin Суббота, 20 июня 2009 11:32
емую функцию (такую как draw(), erase() или test()), вы должны перенаправить все вызовы через указатель s в реализации базового класса, как было показано ранее. Дело в том, что вызов функции «конвер- Строитель 507 та» будет интерпретирован как относящийся к типу Shape, а не к типу, производному от Shape. Только при перенаправлении вызова через s заработает механизм виртуального вызова. Пример показывает, что в функции main() все работает правильно, даже при вызове функций в конструкторах и деструкторах. Работа деструкторов Уничтожение объектов в этой схеме тоже происходит нетривиально. Чтобы разобраться, давайте мысленно проследим за тем, что происходит при вызове оператора delete для указателя на объект Shape (а конкретно Square), созданный в куче (ситуация с объектом, созданным в стеке, проще). Вызов delete через полиморфный интерфейс осуществляется при вызове purge(). В shapes хранятся указатели на базовый класс Shape, поэтому компилятор направляет вызов через Shape. В обычной ситуации такой вызов был бы виртуальным, что привело бы к вызову деструктора Square. Но в имитации виртуального конструктора
Комментарии закрыты.
Последние комментарии