Привет ребята! Снова я. :( 1) При объявлении метода виртуальным, компилятор требует, чтобы у метода объекта потомка заголовок был с теми-же пораметрами. т.е. под именем метода подразумевается его имя и параметры... Какой тогда смысл, если 2)создавая у потомка, метод с тем же именем (не виртуальный (оба)) мы, тем самым (по опыту проведенному с маленькими программками), полностью перекрываем метод предка. 3)Если у метода родителя не указывать Virtual, а у метода предка указать - все работает. Но смысл, если (2)??! Или в случае (2) я рискую нарваться на большие глюки в будущем? Все таки, кто ни будь в курсе как делать правильно? 4)Насчет параметра, объявленного как Virtual - это я, конечно лохонулся. Но тем не менее - где то я читал, что это тоже что-то делает. (Не зря же компилятор не выдает ошибку, а требует указать тип)... Что оно делает?
Очень хочется понять!
Здравствуйте, Vitally! Во-первых, переопределяющие виртуальные методы должны иметь такой же набор формальных параметров, как и самый верхний метод в иерархии объектов. Во-вторых, если тип объекта-предка описывает метод как виртуальный, то все потомки, реализующие метод с тем же именем, должны описывать его как виртуальный. Нельзя заменить виртуальный метод статическим. В третьих, отличия переопределения виртуальных методов от статических: 1. если для экземпляра потомка методы предка вызывают другие виртуальные методы, имена которых есть в объекте-предке и в объекте-потомке, то вызываются методы потомка; 2. виртуальные методы используют позднее связывание данных с методами, с помощью которых они будут обрабатываться, т.е. связывание на этапе выполнения программы. В-четвёртых, метод-родитель и метод-предок - это одно и то же. Будьте внимательнее. И последнее.
Если Вы не видите смысла что-то использовать, то зачем забивать себе голову ненужными вещами? Удачи :) Ответ отправлен: 21.12.2003, 19:47 Отправитель: Strory Отвечает _vt
Добрый день, Vitally! 1) Да, это свойство виртуальных методов. 2) Ну и что? Ты можешь и не использовать виртуальные методы совсем. 3) В случае объявления динамических и виртуальных методов, объект должен иметь процедуру, объявленную ключевым словом constructor, и она должна быть вызвана перед выполнением виртуальных методов. В общем, почитай какую-нибудь книжку по ООП.
* Origin: Эй, еж? Тебе понятно?
E-Man 1.5+ on Windows XP SP1
Ответ отправлен: 22.12.2003, 20:00 Отправитель: _vt Отвечает Boriss
Здравствуйте, Vitally! 1-2) Ценность в том, что метод, написанный лет ...надцать назад может вызывать метод, который Вы написали только что (см. например, Turbo Vision - скажем, "переделали" procedure Idle; virtual; - и "старая" оболочка будет ее вызывать) Реализуется это тем, что КАКОЙ ИМЕННО вариант виртуального метода будет вызыван (несколько с одним именем и одинаковыми параметрами в цепочке наследования) определяется в момент ЗАПУСКА программы, а не на стадии разработки ее. Если хотите вызывать "старые" - то тоже пожалуйста, но указываейте из какого объекта 3) Если VIRTUAL не указать, то метод является СТАТИЧЕСКИМ. Для него механиз позднего связывания не работает. То есть в примере с Idle, если не был объявлен ВИРТУАЛЬНЫМ, то пишите что хотите - "старые" методы будут вызывать только "старый" вариант Idle 4)
Не использовал такой вариант, но позднее, как сессионные дела немного разгребу, можно посмотреть и ответить точно. Напиши куда прислать ответ. Мой: bsurin@mail.ru Ответ отправлен: 22.12.2003, 11:22 Отправитель: Boriss Отвечает sir henry
Добрый день, Vitally! Давайте раз и навсегда определимся, зачем нужны ВИРТУАЛЬНЫЕ методы объектов (классов). Виртуальные методы нужны только для того, чтобы внести дополнительные действия внутри метода объекта-потомка, т.е. такие действия, которые у объекта-предка ОТСУТСТВОВАЛИ. Виртуальный метод выполняет все то, что прописано у метода предка. Ответ отправлен: 22.12.2003, 12:59 Отправитель: sir henry Отвечает Drahus
Здравствуйте, Vitally! Снова ты?! :) >Какой тогда смысл, если создавая у потомка, метод с тем же именем (не виртуальный (оба)) мы, тем самым, полностью перекрываем метод предка. Вообще-то по сути перекрытие не полное должно быть. В смысле, что перекрытие происходит только в данном объекте. И что-то там ещё. Есть такие операторы: INHERITED. Что-то я не очень понял для чего он, вроде как раз для того чтобы изменить, а не перекрыть метод; CONSTRUCTOR - с помошью него "должен инициализироваться экземпляр объекта имеющего виртуальеый метод" - фу, еле написал. :). Учитесь работать с ними. 3). Смысл не знаю, но у родителя не нужно указывать Virtual, каков в этом смысл? :) Пришлите простынку вашей проги, естественно с изменениями внесёнными после "обработки" нашими экспертами. :)
Ответ отправлен: 22.12.2003, 17:12 Отправитель: Drahus
Форма отправки вопроса
Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+
или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.