«Метод '% s' скрывает виртуальный метод базового типа '% s'». Что на самом деле скрывается?

После прочтения серии вопросов конструктора Яна Бойда ( 1 , 2 , 3 ], 4 ), я понимаю, что не совсем понимаю буквальное значение того, что скрыто.

Я знаю (поправьте меня, если я ошибаюсь) переопределить единственная цель - иметь возможность иметь полиморфное поведение, чтобы во время выполнения можно было разрешить метод в зависимости от фактического типа экземпляра, а не от объявленного типа. Рассмотрим следующий код:

type
  TBase = class
    procedure Proc1; virtual;
    procedure Proc2; virtual;
  end;

  TChild = class(TBase)
    procedure Proc1; override;
    procedure Proc2;            // <- [DCC Warning]
  end;

procedure TBase.Proc1;
begin
  Writeln('Base.Proc1');
end;
procedure TBase.Proc2;
begin
  Writeln('Base.Proc2');
end;

procedure TChild.Proc1;
begin
  inherited Proc1;
  Writeln('Child.Proc1');
end;
procedure TChild.Proc2;
begin
  inherited Proc2;
  Writeln('Child.Proc2');
end;

var
  Base: TBase;
begin
  Base := TChild.Create;
  Base.Proc1;
  Writeln;
  Base.Proc2;
  Base.Free;
  Readln;
end.

Который выводит:

Base.Proc1
Child.Proc1

Base.Proc2

В предупреждении на TChild.Proc2 говорится, что это метод « скроет доступ к одноименному методу базы ». Что я вижу, если я не t override Proc2 Я теряю возможность разрешения метода на его фактический тип, а не на его базовый тип. Как это сокрытие доступа к базовому методу?

Далее, в документации по предупреждению в качестве решения предупреждения, указано, что:

Во-первых, вы можете указать переопределение для сделать процедуру производного класса также виртуальный, что позволяет унаследовать призывает по-прежнему ссылаться на оригинал процедура.

Теперь, если я создаю экземпляр TChild из TChild (без полиморфизма), унаследованный вызов в непереопределенном методе явно ссылается на исходную процедуру. Если я создаю экземпляр «Дочерний» из «TBase», вызов даже не преобразуется в метод «TChild», как я могу вызвать «Inherited», который вообще будет относиться к чему-либо?

Что я не понимаю?

6
задан Community 23 May 2017 в 12:33
поделиться