Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на языке Pascal


Информационный Канал Subscribe.Ru


RusFAQ.ru: Программирование на языке Pascal

Выпуск № 222
от 24.12.2003, 13:20

Администратор:
Имя: Sensey
URL: Информационный ресурс
ICQ: 105679124
Украина, Харьков
О рассылке:
Задано вопросов: 388
Отправлено ответов: 1382
Активность: 356.1 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

Strory
Статус: Начальный
Общий рейтинг: 162.5
[Подробней >>]
_vt
Статус: Профессиональный
Общий рейтинг: 118.84
[Подробней >>]
Boriss
Статус: Профессиональный
Общий рейтинг: 149.83
URL: Программирование на Паскале
[Подробней >>]
 
sir henry
Статус: Профессиональный
Общий рейтинг: 161.58
[Подробней >>]
Drahus
Статус: Опытный
Общий рейтинг: 167.92
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 379. Привет ребята! Снова я. :( 1) При объявлении метода виртуальным, компилятор требует, чтобы у метода ... (ответов: 5)

Вопросов: 1, ответов: 5


 Вопрос № 379

Привет ребята!
Снова я. :(
1) При объявлении метода виртуальным, компилятор требует, чтобы у метода объекта потомка заголовок был с теми-же пораметрами. т.е. под именем метода подразумевается его имя и параметры... Какой тогда смысл, если
2)создавая у потомка, метод с тем же именем (не виртуальный (оба)) мы, тем самым (по опыту проведенному с маленькими программками), полностью перекрываем метод предка.
3)Если у метода родителя не указывать Virtual, а у метода предка указать - все работает. Но смысл, если (2)??! Или в случае (2) я рискую нарваться на большие глюки в будущем?
Все таки, кто ни будь в курсе как делать правильно?
4)Насчет параметра, объявленного как Virtual - это я, конечно лохонулся. Но тем не менее - где то я читал, что это тоже что-то делает. (Не зря же компилятор не выдает ошибку, а требует указать тип)... Что оно делает? Очень хочется понять!



Вопрос отправлен: 21.12.2003, 13:19
Отправитель: Vitally

[Следующий вопрос >>] [Список вопросов]

Отвечает Strory

Здравствуйте, 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.

(C) 2002-2003 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


Приложение (если необходимо):


Получить ответов:


 Выбор рассылки

Программисту
Assembler (26)
C / C++ (18)
Perl (4)
Builder / Delphi (19)
Pascal (21)
Basic / VBA (3)
Java / JavaScript (5)
PHP (11)
Криптография (9)
WinAPI (12)
Пользователю
Windows 95/98/Me (34)
Windows NT/2000/XP (48)
"Железо" (25)
Поиск информации (18)
Администратору
Windows NT/2000/XP (27)
Linux / Unix (15)
Юристу
Гражданское право (12)
Семейное право (8)
Трудовое право (9)
КоАП (8)

Отправить вопрос всем экспертам выбранной рассылки.




Задать вопрос | Регистрация эксперта | Поиск в базе | Чат | Форумы | Новости
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование
Профессиональная WEB-Студия B.I.T.


Яндекс цитирования
© 2001-2003 Россия, Москва. Авторское право: Калашников О.А.

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное