W1010 メソッド '%s' で基底型 '%s' の仮想メソッドが隠蔽されます(Delphi)
エラーと警告のメッセージ(Delphi) への移動
基底クラスの仮想メソッドと同じ名前のメソッドを宣言しています。新しいメソッドは仮想メソッドではないため、基底クラスの同じ名前のメソッドに対するアクセスが隠蔽されます。
program Produce;
type
Base = class(TObject)
procedure VirtuMethod; virtual;
procedure VirtuMethod2; virtual;
procedure VirtuMethod3; virtual;
end;
Derived = class(Base)
procedure VirtuMethod;
procedure VirtuMethod2;
procedure VirtuMethod3;
end;
procedure Base.VirtuMethod;
begin
end;
procedure Base.VirtuMethod2;
begin
end;
procedure Base.VirtuMethod3;
begin
end;
procedure Derived.VirtuMethod;
begin
end;
procedure Derived.VirtuMethod2;
begin
end;
procedure Derived.VirtuMethod3;
begin
end;
begin
end.
Derived の定義で宣言されているどのメソッドも、Base クラスで宣言されている同じ名前の仮想関数を隠蔽しています。
この警告を解決する方法は 3 つあります。
- 上位クラスの対応するメソッドが virtual または dynamic と宣言されている場合には、override を指定することで派生クラスの手続きも仮想にすることができ、継承された呼び出しで元の手続きを参照できるようになります。
- 派生クラスで宣言されている手続きの名前を変更します。
- この 2 つの方法は、下のソース コードで使われています。
- 手続き宣言に reintroduce 指令を追加し、そのメソッドについての警告が表示されないようにします。reintroduce キーワードでは、基底クラスの同じ名前のメソッドで virtual でも dynamic でもないものをオーバーライドする可能性がないため、対応するメソッドを隠蔽し、警告を表示しないよう、Delphi コンパイラに指示します。
program Solve;
type
Base = class(TObject)
procedure VirtuMethod; virtual;
procedure VirtuMethod2; virtual;
procedure VirtuMethod3; virtual;
end;
Derived = class(Base)
procedure VirtuMethod; override;
procedure Virtu2Method;
procedure VirtuMethod3; reintroduce;
end;
procedure Base.VirtuMethod;
begin
end;
procedure Base.VirtuMethod2;
begin
end;
procedure Base.VirtuMethod3;
begin
end;
procedure Derived.VirtuMethod;
begin
end;
procedure Derived.Virtu2Method;
begin
end;
procedure Derived.VirtuMethod3;
begin
end;
begin
end.