2013-07-01 19 views
7

Kiedy zapomniałem dodać słowa kluczowe "wirtualne" i "przesłonięcie" ostatnio, oczekiwałbym ostrzeżenia kompilatora, gdy przypadkowo użyłem tej samej nazwy dla procedura w klasie pochodnej. Nie mam nic, a teraz nie rozumiem, dlaczego. Co muszę zrobić, aby uzyskać ostrzeżenia dotyczące ukrywania podstawowych członków i metod?Kompilator nie ostrzega podczas ukrywania zmiennych składowych i/lub procedur

Według this answer (Jim McKeeth, który jest niewątpliwie poprawne):

Jeśli zadeklarować metody w klasie potomka, który ma taką samą nazwę jak metoda w klasie przodek to jesteś ukrywał, że metoda przodka - czyli jeśli masz instancję klasy potomka (która jest określana jako ta klasa), to nie otrzymasz zachowania przodka. Kompilator da ci ostrzeżenie.

Jednak ku mojemu zdziwieniu ten kod nie daje mi ostrzeżenie:

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. 

używam Delphi XE i mój kompilator mówi, wszystko jest w porządku:

Sprawdzanie zależności projektowych. .. Building Project1.dproj (Debug, Win32) Linia komend dcc dla "Project1.dpr" c: \ program files \ embarcadero \ rad studio \ 8.0 \ bin \ dcc32.exe - $ O- - $ W + - $ YD --no-config -B -Q -AWinTypes = Wiatr ows; WinProcs = Windows; DbiTypes = BDE; DbiProcs = BDE; DbiErrs = BDE -DDEBUG -E "C: \ Wyjście kompilatora" -I "c: \ program files \ embarcadero \ rad studio \ 8.0 \ lib \ Win32 \ debug"; "c: \ program plików \ embarcadero \ rad studio \ 8.0 \ RaveReports \ Lib ";" c: \ program files \ embarcadero \ rad studio \ 8.0 \ lib \ win32 \ debug ";" c: \ program files \ embarcadero \ rad studio \ 8.0 \ Imports " ; "C: \ Users \ Public \ Documents \ RAD Studio \ 8.0 \ Dcp"; "c: \ program files \ embarcadero \ rad studio \ 8.0 \ include"; "C: \ Program Pliki \ Raize \ CS4 \ Lib \ RS-XE ";" c: \ program files \ embarcadero \ rad studio \ 8.0 \ lib \ win32 \ release ";" c: \ program files \ embarcadero \ rad studio \ 8.0 \ RaveReports \ Lib "-LE" C: \ Users \ Public \ Documents \ RAD Studio \ 8.0 \ Bpl "-LN" c: \ program files \ embarcadero \ rad studio \ 8.0 \ bin \ Dcp " -N0" C: \ Dane wyjściowe kompilatora \ DCU "-O" c : \ program files \ embarcadero \ rad studio \ 8.0 \ Imports ";" C: \ Users \ Public \ Documents \ RAD Studio \ 8.0 \ Dcp "; "c: \ program files \ embarcadero \ rad studio \ 8.0 \ include"; "C: \ Program Files \ Raize \ CS4 \ Lib \ RS-XE"; "c: \ program files \ embarcadero \ rad studio \ 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 Studio \ 8.0 \ Dcp ";" c: \ program files \ embarcadero \ rad studio \ 8.0 \ include ";" C: \ Program Files \ Raize \ CS4 \ Lib \ RS-XE ";" c: \ program files \ embarcadero \ rad studio \ 8.0 \ lib \ win32 \ release ";" c: \ program files \ embarcadero \ rad studio \ 8.0 \ RaveReports \ Lib "-U" c: \ program files \ embarcadero \ rad studio \ 8.0 \ lib \ Win32 \ debug ";" c: \ program files \ embarcadero \ rad studio \ 8.0 \ RaveReports \ Lib ";" c: \ program files \ embarcadero \ rad studio \ 8.0 \ lib \ win32 \ debug ";" c: \ program files \ embarcadero \ rad studio \ 8.0 \ Imports ";" C: \ Users \ Public \ Documents \ RAD Studio \ 8.0 \ Dcp ";" c: \ program pliki \ embarcadero \ rad studio \ 8.0 \ include "; "C: \ Program Files \ Raize \ CS4 \ Lib \ RS-XE"; "c: \ program files \ embarcadero \ rad udio \ 8.0 \ lib \ win32 \ release "; "c: \ program files \ embarcadero \ rad studio \ 8.0 \ RaveReports \ Lib" -K00400000 -NB "c: \ program files \ embarcadero \ rad studio \ 8.0 \ bin \ Dcp" -NH "C: \ Users \ Public \ Documents \ RAD Studio \ 8.0 \ hpp "-NO" C: \ Wyjście kompilatora \ DCU "Project1.dpr Success Czas, który upłynął: 00:00:00.2

Domyślam się, że albo ja źle zrozumieć wspomnianą cytat Jim McKeeth czy mam jakieś ustawienie w moim kompilatora, że ​​nie jestem świadomy (Zrobiłem przetestować go na innym komputerze przy okazji, te same wyniki) . Każda pomoc będzie bardzo ceniona.

+1

Podana odpowiedź była błędna, podobnie jak kilka innych odpowiedzi na to pytanie. Naprawiłem niedokładności w tej odpowiedzi. –

Odpowiedz

5

documentation opisano te określone zasadami jak następuje:

HIDDEN_VIRTUAL: Włączenie lub wyłączenie ostrzeżenia wytwarzanego przy potomkiem deklaruje sposób o tej samej nazwie, jako sposób prowadzi przodka i przodka Metoda jest wirtualna, ale metoda potomka pod nazwą nie jest przesłonięciem.
(Patrz W1010 Method '%s' hides virtual method of base type '%s' (Delphi).)

HIDING_MEMBER: Włączenie lub wyłączenie ostrzeżeń produkowanych gdy potomek deklaruje nową właściwość o tej samej nazwie w postaci nieruchomości w przodka.
(Patrz W1009 Redeclaration of '%s' hides a member in the base class (Delphi).)

Ani ostrzeżenie dotyczy kodzie. W przypadku HIDDEN_VIRTUAL nie masz żadnych metod wirtualnych. A w przypadku HIDING_MEMBER nie masz żadnych właściwości.

Skorzystaj z linków w cytowanej sekcji powyżej (lub z głównego linku dokumentacji w pierwszym zdaniu), aby znaleźć pełne szczegóły tych ostrzeżeń.

+0

David, dziękuję za szybką odpowiedź. Wygląda na to, że takie zachowanie jest zgodne z projektem. Czy jednak nie jest to wprost sprzeczne z cytatem Jim'a McKeeth? A jeśli tak, czy nie powiedziałbyś, że cytat Jima ma więcej sensu? Tak czy inaczej, jeśli tak jest naprawdę, czy zgodziłbyś się, że odpowiedź Jima powinna zostać zmieniona, ponieważ jest nieprawdziwa (tzn. Niekompletna) i wprowadzająca w błąd? – SpaghettiCook

+0

Powiedziałbym, że jest to zgodne z projektem. Ukrywanie metod statycznych jest nieco normalne. Ukrywanie wirtualnych jest wyjątkowo niezwykłe i niebezpieczne. Podobnie właściwości. Odpowiedź Jima nie jest dokładna. –

+0

OK, wystarczy. Nie to, czego się spodziewałem, ale wydaje mi się, że codziennie uczysz się czegoś nowego. – SpaghettiCook

Powiązane problemy