IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

> ООП, Полиморфизм
Client
сообщение 15.02.2009 16:00
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


Всем привет!
Начал изучать ООП и появились вопросы. Вроде с наследованием и инкапсуляцией понятно, а вот с полиморфизмом не понятно. Можете объяснить для чего он нужен и что такое виртуальные методы?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 15.02.2009 17:01
Сообщение #2


Гость






Не путай теплое с мягким... Наследование - это необходимое условие полиморфизма, нельзя сделать полиморфность без наследования. Смотри:
type
ta = object
constructor init;
procedure print; virtual;
end;

constructor ta.init;
begin end;
procedure ta.print;
begin writeln('TA object') end;

procedure proc(var obj: ta);
begin
obj.print;
end;

type
tb = object(ta)
constructor init;
procedure print; virtual;
end;

constructor tb.init;
begin inherited init; end;
procedure tb.print;
begin writeln('TB object') end;

var
A: ta;
B: tb;
begin
a.init; proc(a);
b.init; proc(b);
end.
Чувствуешь? Proc принимает объект типа TA или его потомка (неважно, насколько далекого, может "сын", а может и "внук", "правнук" и т.д.), и вызывает метод нужного типа. То есть, для того, чтобы напечатать значение любого потомка достаточно "заказать" в определенном классе нужную тебе функциональность. Я "заказал" реализацию TB.print, что заказал, то и получил... Только наследованием (без виртуализации) этого добиться нельзя. Если в вышеприведенном примере не будет виртуальных методов, то процедура не будет полиморфной, она для любого переданного объекта будет вызывать метод TA.print...
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Client   ООП   15.02.2009 16:00
volvo   Ну, ты же здесь был: ООП. Объектно-ориентированное...   15.02.2009 16:19
Client   В наследовании есть родитель и потомок, где потомо...   15.02.2009 16:27
volvo   Не путай теплое с мягким... Наследование - это нео...   15.02.2009 17:01
Client   O_o незнал.procedure proc(var obj: ta); begin ob...   15.02.2009 17:16
volvo   Это вызов метода из непосредственного родителя... ...   15.02.2009 17:37
Client   uses crt; type ta = object constructor init;...   15.02.2009 18:34
volvo   Да, работает... Только некорректно это. При инициа...   15.02.2009 18:40
Client   Инициализация?? т.е. присваивание полям значений и...   15.02.2009 18:43
volvo   И то и другое... Вот, например, при инициализации ...   15.02.2009 19:37
Client   УРЯЯЯЯ!!! я понял) тут мы просто испол...   16.02.2009 16:22
volvo   Если ты про конструктор - то я тебе еще больше ска...   16.02.2009 19:04
Client   Вроде понял) Спасибо за ответы!   16.02.2009 20:29
fedyafed   Листинг программы от Дата 15.02.2009 17:01 содержи...   6.02.2011 10:25
volvo   Никак не нужно настраивать, он по умолчанию прекра...   6.02.2011 10:49
Гость   А overload и override компилятор не понимает(. Это...   6.02.2011 11:23


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 21.07.2025 10:26
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"