Зачем нужны виртуальные методы?

amadeus
Дата: 07.07.2019 19:08:39
Зачем нужны виртуальные методы, если при помощи inherited можно обратиться к одноименному методу родительского класса, даже если он не виртуальный?

TA = class
  function get(): String;
end;

TB = class(TA)
  function get(): String;
end;

...

function TA.get(): String;
begin
  result := 'a';
end;

function TB.get(): String;
begin
  result := inherited;
  //result := 'b';
end;

...

showMessage(b.get());//Возвращает "a"
rgreat
Дата: 07.07.2019 19:17:44
Only virtual and dynamic methods can be overridden. All methods, however, can be overloaded;
amadeus
Дата: 07.07.2019 19:21:08
rgreat, чем не переопределение, если в дочернем классе я создам одноименный метод и просто не буду вызывать inherited (либо, буду, в зависимости от ситуации).
asutp2
Дата: 07.07.2019 19:21:53
amadeus,

почитай основы языка, что ли
amadeus
Дата: 07.07.2019 19:24:19
asutp2, *&##*!
asutp2
Дата: 07.07.2019 19:31:19
amadeus, ну если ты не понимаешь, то вот тебе простой пример:

type
  TA = class
    procedure M; virtual;
  end;
  TB = class(TA)
    procedure M; override;
  end;
  TC = class(TA)
    procedure M; override;
  end;

procedure TA.M;
begin
  ShowMessage('TA');
end;

procedure TB.M;
begin
  ShowMessage('TB');
end;

procedure TC.M;
begin
  ShowMessage('TC');
end;

procedure Test;
var
  test: TA;
begin
  test := TA.Create;
  test.M;
  test := TB.Create;
  test.M;
  test := TC.Create;
  test.M;
end;
asutp2
Дата: 07.07.2019 19:40:50
  TC = class(TB)
    procedure M; override;
  end;
amadeus
Дата: 07.07.2019 19:52:10
asutp2, спасибо, теперь понятно. Полиморфизм обеспечивает "двустороннюю связь" между классами.
white_nigger
Дата: 07.07.2019 23:02:40
Здесь есть смайлик рука-лицо?
Гаджимурадов Рустам
Дата: 08.07.2019 09:40:03

+

Картинка с другого сайта.


Дима давал ссылку на еще какую-то прикольную, но тут
анимированные гифки не работают, а мне искать лень.

Posted via ActualForum NNTP Server 1.5