Vererbung verliert virtual Methode

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Mathias
Beiträge: 5084
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Vererbung verliert virtual Methode

Beitrag von Mathias »

Ich habe eine sehr kleine Demo zur Vererbung geschrieben.
Dazu habe ich 2 Klassen, wobei TWindow von TView vererbt wird.

Meine Frage, wieso wird bei Ausgabe() nicht die Methode verwendet, welche ich mit vitual; überschrieben habe ?
Als Test habe ich folgend Methode:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  Ausgabe(view);  // --> View
  Ausgabe(win);   // --> Window

  view.Draw;      // --> View
  win.Draw;       // --> View
end;   
Über den Umweg mit Ausgabe, verliert er die virtuelle vererbte Methode.
Kann man dies irgendwie umgehen ?

Es kommt noch folgende Warnung:

Code: Alles auswählen

unit1.pas(21,15) Warning: An inherited method is hidden by "Draw;"
Ich denke, das hat damit zu tun.

Im Anhang die komplette Source.
Dateianhänge
window_Vererbung.zip
(124.98 KiB) 7-mal heruntergeladen
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2302
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.8, FPC 3.0.4)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Vererbung verliert virtual Methode

Beitrag von m.fuchs »

Bei der Ableitung musst du override an Stelle von virtual benutzen.

Mit virtual sagst du, dass eine Methode in einer abgeleiteten Klasse überschrieben werden darf. Mit override überschreibst du sie dann.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

PascalDragon
Beiträge: 85
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Vererbung verliert virtual Methode

Beitrag von PascalDragon »

Zusätzlich zu dem was m.fuchs sagt: der Compiler warnt dich auch, dass da was nicht passt:
unit1.pas(21,15) Warning: An inherited method is hidden by "Draw;"
FPC Compiler Entwickler

Mathias
Beiträge: 5084
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Vererbung verliert virtual Methode

Beitrag von Mathias »

Danke, das wars.

Was mich verwundert, wieso sieht man bei den Sourcen von FreeVision nirgends ein override ?
Oder ist das etwa bei object anders als bei class ?
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 85
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Vererbung verliert virtual Methode

Beitrag von PascalDragon »

Mathias hat geschrieben:
Fr 11. Sep 2020, 17:06
Was mich verwundert, wieso sieht man bei den Sourcen von FreeVision nirgends ein override ?
Oder ist das etwa bei object anders als bei class ?
Korrekt. override wurde von Borland erst mit class eingeführt, da sie die Schwächen im object-System erkannt haben.
FPC Compiler Entwickler

Antworten