Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 13.10.2013
Сообщений: 99
1

Что значит замена в процедуре

26.01.2015, 10:48. Показов 750. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В лекциях по ООП у нас есть так называемая проблема "среза", но без объяснений, только код. Выделена строка (комментарием) и заменена на другую строку во втором коде. Поэтому вопрос: почему заменили и что происходит в правильной строке?
Помогите, пожалуйста.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Type TTransport = class 
public 
      function Speed:float; virtual; 
end;
TAirTransport = class 
public 
function Speed:float; override; 
function Altitude:float; override;
end;
procedure main; 
var t:TTransport;
begin 
        t := TAirtransport.Create;
    printf(t.Speed);
    printf(t.Altitude);//вот эта строка неправильная
    t.Free; 
end;
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Type TTransport = class 
public 
      function Speed:float; virtual; 
end;
TAirTransport = class 
public 
function Speed:float; override; 
function Altitude:float; override;
end;
procedure main; 
var t:TTransport;
begin 
        t := TAirtransport.Create;
    printf(t.Speed);
    printf((t as TAirtransport).Altitude);//заменено на эту
    t.Free; 
end;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.01.2015, 10:48
Ответы с готовыми решениями:

Что значит это условие? Немогу расчехлить на что тут идёт проверка!!!
НЕмогу понять на что идет проверка. if monthof(DateTimePicker1.date+33)<9 then...

Что читается в процедуре?
Добрый день, подскажите пожалуйста, что можно тут наблюдать. Прокомментируйте пожалуйста. ...

Подскажите, что в процедуре не так
procedure TForm1.Button2Click(Sender: TObject); var F:TextFile; i:integer; temp:string; ...

Что значит $FF?
Вот в этом коде: procedure TForm1.Button3Click(Sender: TObject); var buff: array of char;...

18
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
26.01.2015, 10:53 2
Цитата Сообщение от Betelgeuse7 Посмотреть сообщение
почему заменили
Шило на мыло заменили.
Ни так ни эдак не правильно.
Привет преподу)
0
1 / 1 / 0
Регистрация: 13.10.2013
Сообщений: 99
26.01.2015, 10:54  [ТС] 3
mss, а как тогда правильно?)
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
26.01.2015, 10:56 4
Цитата Сообщение от Betelgeuse7 Посмотреть сообщение
а как тогда правильно?
А это зависит от конкретной постановки задачи.
0
1 / 1 / 0
Регистрация: 13.10.2013
Сообщений: 99
26.01.2015, 10:57  [ТС] 5
mss, в этом загвоздка, ибо дан просто кусок кода.
0
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
26.01.2015, 11:00 6
У предка нет метода Altitude, поэтому он не может быть переопределенным.
0
1 / 1 / 0
Регистрация: 13.10.2013
Сообщений: 99
26.01.2015, 11:02  [ТС] 7
FIL, а кто тут предок? Ttransport?
0
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
26.01.2015, 11:02 8
Точнее, он даже предком не является. Получается, что оба примера - полная ерунда.
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
26.01.2015, 11:05 9
Цитата Сообщение от Betelgeuse7 Посмотреть сообщение
ибо дан просто кусок кода
Ну хоть пробовал его скомпилять ?
Ни тот ни другой кусок компиляться не будет, ибо для класса TAirTransport указан неправильный предок, а метод TAirTransport.Altitude в дан.случае не может быть виртуальным.
0
1 / 1 / 0
Регистрация: 13.10.2013
Сообщений: 99
26.01.2015, 11:08  [ТС] 10
FIL, mss, ладно, провал с этим(
Может кто-нибудь из вас знает где можно найти пример именно на Delphi проблемы "среза"? Просто есть такой вопрос в экзаменационных билетах, а как видите, никакой базы для подготовки этого вопроса
P.S. Искала в инете - нашла только на С++, но это пока темный лес для меня и на экзамене Delphi.
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
26.01.2015, 11:09 11
Если же предком сделать (как это очевидно) TTransport, тогда у предка д.б. объявлен виртуальным метод Altitude, но тогда, к примеру, класс TИшак будет довольно смешно сделать наследником TTransport ..а ведь ишак - тоже транспорт)
0
1 / 1 / 0
Регистрация: 13.10.2013
Сообщений: 99
26.01.2015, 11:13  [ТС] 12
mss, я без понятия как это сделать, к сожалению( Плохо еще понимаю все эти предки-потомки. Тем более реализацию этого в коде((
Нужен нормальный пример, иначе, если попадется этот билет - пипец(
0
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
26.01.2015, 11:22 13
Цитата Сообщение от Betelgeuse7 Посмотреть сообщение
так называемая проблема "среза"
Что под этим подразумевается даже Гугль не знает.
Может это личная проблема вашего препода?)
0
mss
26.01.2015, 11:25
  #14

Не по теме:

Цитата Сообщение от Betelgeuse7 Посмотреть сообщение
попадется этот билет - пипец
Желаю чтобы сразу и без мучений)

0
1 / 1 / 0
Регистрация: 13.10.2013
Сообщений: 99
26.01.2015, 11:29  [ТС] 15
FIL,
Проблема «среза» в полиморфизме: Данная проблема возникает в том случае, когда указателю на базовый класс присваивается ссылка на класс-потомок. Т.к. базовый класс не имеет представления о методах класса-потомка, то эти методы как бы «срезаются». Данную проблему можно решить путём приведения типов – указатель на базовый класс приводится к типу класса-потомка. Пример: Пусть дан класс родитель – Person.GetName(), и два класса-наследника – Student.GetID() и Prepod.GetAddress().
C++
1
2
3
4
5
6
7
Person *p = new Student; 
p -> GetName();   // OK 
p -> GetID();         // Error СРЕЗ 
Для решения данной проблемы используются операторы преобразования типа – dynamic_cast и static_cast. Воспользуемся вторым оператором, т.к. в классе предке нет виртуальной функции: 
static_cast (p) -> GetID(); // OK 
или же 
(student *) (p) -> GetID();          // OK
Источник: http://5fan.info/polotrujgpolrnayfs.html

Только такое нашла. Но как это на Дэлфи перенести - не знаю.
Честно говоря, не помню, чтобы препод акцентировал внимание на этой проблеме среза, но блин, она есть в билетах!
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
26.01.2015, 11:41 16
TAirTransport = class(TTransport)
public
function Speed:float; override;
function Altitude:float; override;
end;

Добавлено через 4 минуты
Смысл этой абракадабры такой - не всякий транспорт способен передвигаться над землей, и потому понятие "высота" к нему неприменимо, но всякий воздушный транспорт передвигается над землей некоей высоте.
1
1 / 1 / 0
Регистрация: 13.10.2013
Сообщений: 99
26.01.2015, 11:43  [ТС] 17
mss, это, получается, все?) Или это в тех процедурах заменить?)
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
26.01.2015, 11:44 18
не в процедурах, а в объявлении класса ТЭйрТранспорт
0
1 / 1 / 0
Регистрация: 13.10.2013
Сообщений: 99
26.01.2015, 11:46  [ТС] 19
mss, да, я просто почему-то не подумав написала "процедуры" имея в виду те куски кода
Спасибо)
0
26.01.2015, 11:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.01.2015, 11:46
Помогаю со студенческими работами здесь

HInstance - что значит?
HInstance в Delphi. Что значит HInstance? К примеру в этой функции LoadCursor(HInstance,...

Что значит эта ошибка ?
LOCK INC .StrRec.refCnt Что это за ошибка ? (Во вкладке System) При работе в многопоточном...

Что значит это ошибка?
Что может значить, это ошибка : "project address faulted with massage: 'access violation at...

Что вот это значит?
Button1.Enabled := Pos > 0; Button2.Enabled := (Pos < FileSize(NoteFile) - 1); Просто я впервые...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru