2013-07-01 2 views
7

Wenn ich vergessen habe, die Schlüsselwörter 'virtual' und 'override' hinzuzufügen, hätte ich eine Compiler-Warnung erwartet, wenn ich versehentlich den gleichen Namen für eine verwendet habe Prozedur in einer abgeleiteten Klasse. Ich habe keine und jetzt verstehe ich nicht warum. Was muss ich tun, um Warnungen zum Ausblenden von Basiselementen und Methoden zu erhalten?Der Compiler gibt keine Warnung beim Ausblenden von Membervariablen und/oder Prozeduren aus

Nach this answer (von Jim McKeeth, der zweifellos richtig ist):

Wenn Sie eine Methode in einer abgeleiteten Klasse deklarieren, die den gleichen Namen wie eine Methode in einem Vorfahren Klasse hat dann steckst du, dass Vorfahrmethode - das heißt, wenn Sie eine Instanz dieser Nachkommenklasse haben (auf die als diese Klasse verwiesen wird), erhalten Sie nicht das Verhalten des Vorfahrs. Der Compiler wird Sie warnen.

jedoch dieser Code zu meiner Überraschung nicht geben Sie mir eine Warnung:

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. 

Ich bin mit Delphi XE und mein Compiler sagt alles ist in Ordnung:

Projektabhängigkeiten zu prüfen. .. Erstellen von Project1.dproj (Debug, Win32) dcc-Befehlszeile für "Project1.dpr" c: \ Programme \ embarcadero \ rad Studio \ 8.0 \ bin \ dcc32.exe - $ O- - $ W + - $ YD --no-config -B -Q -AWinTypes = Wind Windows, WinProcs = Windows, DbiTypes = BDE; DbiProcs = BDE; DbiErrs = BDE -DDEBUG -E "C: \ Compiler-Ausgabe" -I "c: \ Programme \ embarcadero \ rad Studio \ 8.0 \ lib \ Win32 \ debug"; "c: \ Programm Dateien \ embarcadero \ radstudio \ 8.0 \ RaveReports \ Lib ";" c: \ programmdateien \ embarcadero \ radstudio \ 8.0 \ lib \ win32 \ debug ";" c: \ programmdateien \ embarcadero \ rad studio \ 8.0 \ Imports " ; "C: \ Benutzer \ Öffentlich \ Dokumente \ RAD Studio \ 8.0 \ Dcp"; "c: \ Programme \ Embarcadero \ rad Studio \ 8.0 \ include"; "C: \ Programme Files \ Raize \ CS4 \ Lib \ RS-XE ";" c: \ Programme \ embarcadero \ rad Studio \ 8.0 \ lib \ win32 \ Veröffentlichung ";" c: \ Programme \ embarcadero \ rad Studio \ 8.0 \ RaveReports \ Lib "-LE" C: \ Benutzer \ Öffentlich \ Dokumente \ RAD Studio \ 8.0 \ Bpl "-LN" c: \ Programme \ embarcadero \ rad Studio \ 8.0 \ bin \ Dcp " -N0" C: \ Compiler-Ausgabe \ DCU "-O" c : \ program files \ embarcadero \ radstudio \ 8.0 \ Imports ";" C: \ Benutzer \ Öffentlich \ Dokumente \ RAD Studio \ 8.0 \ Dcp "; "c: \ program Dateien \ embarcadero \ rad Studio \ 8.0 \ include"; "C: \ Programme \ Raize \ CS4 \ Lib \ RS-XE"; "c: \ Programme \ embarcadero \ rad Studio \ 8.0 \ lib \ win32 \ release "; "c: \ Programme \ embarcadero \ rad Studio \ 8.0 \ RaveReports \ Lib" -R "c: \ Programme \ embarcadero \ rad Studio \ 8.0 \ Imports"; "C: \ Benutzer \ Öffentlich \ Dokumente \ RAD Studio \ 8.0 \ Dcp ";" c: \ Programme \ embarcadero \ rad Studio \ 8.0 \ include ";" C: \ Programme \ Raize \ CS4 \ Lib \ RS-XE ";" c: \ Programme \ embarcadero \ rad studio \ 8.0 \ lib \ win32 \ release ";" c: \ programmdateien \ embarcadero \ radstudio \ 8.0 \ RaveReports \ Lib "-U" c: \ programmdateien \ embarcadero \ rad studio \ 8.0 \ lib \ Win32 \ debug ";" c: \ Programme \ embarcadero \ rad Studio \ 8.0 \ RaveReports \ Lib ";" c: \ Programme \ embarcadero \ rad studio \ 8.0 \ lib \ win32 \ debug ";" c: \ program files \ embarcadero \ radstudio \ 8.0 \ Imports ";" C: \ Benutzer \ Öffentlich \ Dokumente \ RAD Studio \ 8.0 \ Dcp ";" c: \ program Dateien \ embarcadero \ rad Studio \ 8.0 \ include "; "C: \ Programme \ Raize \ CS4 \ Lib \ RS-XE"; "c: \ Programme \ Embarcadero \ rad st udio \ 8.0 \ lib \ win32 \ release "; "c: \ Programme \ embarcadero \ rad Studio \ 8.0 \ RaveReports \ Lib" -K00400000 -NB "c: \ Programme \ embarcadero \ rad Studio \ 8.0 \ bin \ Dcp" -NH "C: \ Benutzer \ Öffentlich \ Dokumente \ RAD Studio \ 8.0 \ hpp "-NO" C: \ Compilerausgabe \ DCU "Project1.dpr Erfolg Verstrichene Zeit: 00:00:00.2

Meine Vermutung ist, dass ich entweder das oben genannte Zitat von Jim McKeeth falsch verstanden oder ich habe einige Einstellung in meinem Compiler, ich bin mir nicht bewusst (teste ich habe es auf einem anderen Computer durch die Art und Weise, gleiche Ergebnisse) . Jede Hilfe würde sehr geschätzt werden.

+1

Die referenzierte Antwort war falsch, wie auch einige andere Antworten auf diese Frage. Ich habe die Ungenauigkeiten in dieser Antwort behoben. –

Antwort

5

Die documentation beschreibt diese insbesondere Warnungen wie folgt:

HIDDEN_VIRTUAL: Schaltet erzeugten Warnungen, wenn ein Abkömmling als ein Verfahren in einem Vorfahren ein Verfahren mit dem gleichen Namen erklärt, und die Vorfahren Methode ist virtuell, aber die Methode des Nachkommens ist keine Überschreibung.
(Siehe W1010 Method '%s' hides virtual method of base type '%s' (Delphi).)

HIDING_MEMBER: Schaltet erzeugt Warnungen, wenn ein Nachkomme als Eigenschaft in einem Vorfahren eine neue Eigenschaft mit dem gleichen Namen erklärt.
(siehe W1009 Redeclaration of '%s' hides a member in the base class (Delphi).)

Weder Warnung an Ihrem Code gilt. Im Fall von HIDDEN_VIRTUAL haben Sie keine virtuellen Methoden. Und im Fall von HIDING_MEMBER haben Sie keine Eigenschaften.

Folgen Sie den Links im zitierten Abschnitt oben (oder dem Hauptdokumentationslink im ersten Satz), um die vollständigen Details für diese Warnungen zu finden.

+0

David, danke für deine schnelle Antwort. Es scheint also, dass dieses Verhalten von Entwurf ist. Widerspricht das nicht genau dem Zitat von Jim McKeeth? Und wenn ja, würdest du nicht sagen, dass Jims Zitat tatsächlich mehr Sinn ergibt? Wie auch immer, wenn das wirklich der Fall ist, würden Sie dann zustimmen, dass Jims Antwort bearbeitet werden sollte, weil sie nicht wahr (d. H. Unvollständig) und irreführend ist? – SpaghettiCook

+0

Ich würde sagen, es ist von Design. Das Verstecken von statischen Methoden ist etwas normal. Virtues zu verstecken ist außergewöhnlich ungewöhnlich und gefährlich. Ebenso Eigenschaften. Jims Antwort ist nicht korrekt. –

+0

Ok, fair genug. Nicht was ich erwartet hatte, aber ich denke du lernst jeden Tag etwas Neues. – SpaghettiCook