2016-08-23 9 views
5

私は仮想関数を持つ基本クラスをしました:"W1010メソッド '%s'は、基本タイプ '%s'の仮想メソッドを警告します。警告?

TMyBaseClass = class(TObject) 
public 
    ValueOne : integer; 
    procedure MyFunction(AValueOne : integer); virtual; 
end; 

procedure TMyBaseClass.MyFunction(AValueOne : integer); 
begin 
    ValueOne := ValueOne; 
end; 

子孫クラスは、同じ名前の関数を実装します。 この関数は新しいparamを追加し、そのanchestorの関数を呼び出します。

TMyDerivedClass = class(TMyBaseClass) 
public 
    ValueTwo : integer; 
    procedure MyFunction(AValueOne : integer; AValueTwo : integer); 
end; 

procedure TMyDerivedClass.MyFunction(AValueOne : integer; AValueTwo : integer); 
begin 
    inherited MyFunction(AValueOne); 
    ValueTwo := ValueTwo; 
end; 

コンパイルしながら、次の警告メッセージが示されている:W1010法

'MyFunctionを' は基本型の仮想メソッドを隠し 'TMyBaseClass'

私はこの問題に対する解決策を見つけましたanother questionを読んでいますが、私はこの警告の原因について疑問を抱いています。 2つの関数のパラメータが異なる場合でも、TMyDerivedClass.MyFunctionはTMyBaseClass.MyFunctionを非表示にしますか?もしそうなら、なぜですか?

答えて

8

documentationは非常に明確に問題を説明します

あなたは、基本クラスで仮想メソッドと同じ名前を持つメソッドを宣言しました。あなたの新しいメソッドは仮想メソッドではありません。同じ名前のベースのメソッドへのアクセスを非表示にします。を隠すとはどういう意味ですか

は、派生クラスから、あなたは、もはや、基本クラスで宣言された仮想メソッドへのアクセス権を持っているということではありません。派生クラスで宣言されたメソッドと同じ名前なので、参照することはできません。後者のメソッドは、派生クラスから見えるメソッドです。

両方のメソッドにoverloadディレクティブが設定されている場合、コンパイラはそれらの引数リストを使用してそれらを区別できます。それがなければ、コンパイラはすべて基本メソッドを隠すことができます。

潜在的な解決策の提案については、リンクされたドキュメントの残りの部分を参照してください。

+0

あなたの答えをありがとう、あなたはそれについてのすべての疑問を解決しました。 – ExDev

関連する問題