2013-07-01 13 views
7

最近、キーワード「virtual」と「override」を追加することを忘れたとき、誤って同じ名前を使用したときにコンパイラの警告が表示されるプロシージャ私は誰もいなくなったので、今なぜ私は理解していない。ベースメンバーやメソッドを隠すための警告を得るには、私は何をする必要がありますか? (間違いなく正しいジムMcKeethによる)this answerによるコンパイラがメンバ変数やプロシージャを隠しているときに警告を出さない

あなたは、あなたがいることを隠している上位クラスのメソッドと同じ名前を持つ子孫クラスのメソッドを宣言した場合ancestor method - その子孫クラスのインスタンス(そのクラスとして参照されている)がある場合、祖先の動作を取得しません。コンパイラは警告を出します。私は、Delphi XEを使用しています

unit Unit1; 

interface 

{$WARNINGS ON} 
{$WARN HIDING_MEMBER ON} 
{$WARN HIDDEN_VIRTUAL ON} 
// I understand the two lines above are superfluous. 
// I put them there to demonstrate that I have tried to enable these 
// warnings explicitly. 

type 
    TBase = class 
    public 
     SomeMember: integer; 
     procedure Foo; 
    end; 

type 
    TDerived = class (TBase) 
    public 
     SomeMember: integer; 
     procedure Foo; 
    end; 

implementation 


{ TBase } 

procedure TBase.Foo; 
begin 

end; 

{ TDerived } 

procedure TDerived.Foo; 
begin 

end; 

end. 

と私のコンパイラは、すべてが大丈夫ですと言う:

しかし、驚いたことに、このコードは、私に警告を与えるものではありません

プロジェクトの依存関係を確認します。 .. ビルドProject1.dproj(Debug、Win32) "Project1.dpr"のdccコマンドライン c:\ program files \ embarcadero \ radスタジオ\ 8.0 \ bin \ dcc32.exe - $ O- - $ W + - $ YD --no-config -B -Q -AWinTypes =風ows; WinProcs = Windows; DbiTypes = BDE; DbiProcs = BDE; DbiErrs = BDE -DDEBUG -E "C:\コンパイラ出力" -I "c:\ program files \ embarcadero \ radスタジオ\ 8.0 \ lib \ Win32 \ debug"; "c:\ program ファイル\デバッグ ";" c:\ program files \ embarcadero \ rad スタジオ\ 8.0 \ Imports " C:¥Program Files¥embarcadero¥rad studio¥8.0¥include ";" C:¥Program ファイル¥Raize¥CS4¥Lib¥¥C:¥Users¥Public¥Documents¥RAD Studio¥8.0¥Dcp " C:\ program files \ embarcadero \ rad スタジオ\ 8.0 \ RaveReports \ Lib "-LE" C:\ program files \ embarcadero \ radスタジオ\ 8.0 \ lib \ win32 \ \ Program Files \ embarcadero \ radスタジオ\ 8.0 \ bin \ Dcp " -N0" C:\コンパイラの出力\ DCU "-O" c :\ program files \ embarcadero \ radスタジオ\ 8.0 \インポート ";" C:\ Users \ Public \ Documents \ RAD Studio \ 8.0 \ Dcp "; "C:\プログラム ファイル\エンバカデロの\ RAD Studioの\ 8.0 \には、"; "C:\プログラムファイル\ Raize \ CS4 \ Libの\のRS-XE"; "C:\プログラムファイル\エンバカデロ\ラドスタジオ\ 8.0 \をlib \ win32 \ release "; "C:¥Program Files¥embarcadero¥rad studio¥8.0¥RaveReports¥Lib" -R "c:¥program files¥embarcadero¥rad studio¥8.0¥Imports"; "C:¥Users¥Public¥Documents¥RAD C:\ Program Files \ lib \ RS-XE "、" c:\ program files \ embricadero \ ¥¥lib¥win32¥release ";" c:¥program files¥embarcadero¥rad studio¥8.0¥RaveReports¥Lib "-U" c:¥program files¥embarcadero¥rad スタジオ\ 8.0 \ lib C:\ program files \ embarcadero \ rad スタジオ\ 8.0 \ lib \ win32 \ debug ";" c:\ program files \ embarcadero \ radスタジオ\ 8.0 \ RaveReports \ Lib " \ program files \ embarcadero \ radスタジオ\ 8.0 \ Imports ";" C:\ Users \ Public \ Documents \ RAD Studio \ 8.0 \ Dcp ";" c:\ program ファイル\ embarcadero \ radスタジオ\ 8.0 \ include "; "C:\ Program Files \ Raize \ CS4 \ Lib \ RS-XE"; "c:\ program files \ embarcadero \ rad st udio \ 8.0 \ lib \ win32 \ release "; "C:\プログラムファイル\ 8.0 \ RaveReports \エンバカデロの\ RAD StudioはLibの\" -K00400000 -NB "C:\プログラムファイルを\ 8.0 \ binに\エンバカデロ\ラドスタジオDCP \" -NH "C:\ Users \ユーザーRAD Studioの\ 8.0 \ HPPを\公共\ドキュメント」-NO "C:DCU" Project1.dpr 成功 経過時間\ \コンパイラの出力00:00:00。私の推測では、私はジムMcKeethことによって、前述の引用を誤解したり、私は(私は同じ結果、途中で一つの他のコンピュータ上でそれをテストしました)を認識していないよ、私のコンパイラでは、いくつかの設定を持っているのどちらかということである2

。どんな助けでも大歓迎です。

+1

参照された答えは間違っていました。その質問に対するいくつかの他の答えも間違っていました。私はその答えに間違いを修正しました。 –

答えて

5

次のようにdocumentationがこれらの特定の警告を説明:

HIDDEN_VIRTUAL:子孫は 祖先における方法と同じ名前のメソッドを宣言する際に生じる警告オンまたはオフし、先祖をメソッドは仮想ですが、子孫の メソッドはオーバーライドではありません。
W1010 Method '%s' hides virtual method of base type '%s' (Delphi)を参照。)

HIDING_MEMBERは:子孫が祖先にプロパティと同じ名前の新しいプロパティを宣言する際に生じる警告オンまたはオフに切り替えます。
W1009 Redeclaration of '%s' hides a member in the base class (Delphi)を参照してください。)

どちらも警告があなたのコードに適用されます。 HIDDEN_VIRTUALの場合、仮想メソッドはありません。 HIDING_MEMBERの場合、プロパティはありません。

これらの警告の詳細については、上の引用セクションのリンク(または最初の文章のメインドキュメントリンク)に従ってください。

+0

David、迅速な答えに感謝します。したがって、この動作は設計上のものであるようです。しかし、ジム・マッケースの言葉に直接矛盾するものではないのですか?もしそうなら、あなたはジムの見積もりが実際に意味をなさないと言っていないでしょうか?どちらの場合でも、これが本当に当てはまる場合、Jimの答えは真実でない(つまり不完全であり誤解を招く)ため、編集する必要があることに同意しますか? – SpaghettiCook

+0

私はそれが設計によると言っています。静的メソッドの隠蔽はやや普通です。仮想を隠すことは非常に珍しく、危険です。同様にプロパティ。ジムの答えは正確ではありません。 –

+0

オクラホマ、十分に。私が期待していたものではありませんが、毎日何か新しいことを学ぶと思います。 – SpaghettiCook

関連する問題