![]() |
Abstrakter Fehler
Delphi-Quellcode:
Ich hab hier eine abstrakte Basisklasse, in den beiden Nachfahren wird dann perform() implementiert.
type TBitOPer = class(TObject)
BoolMap: TBoolMap; constructor Create(InitMap:TBoolMap); destructor Destroy; override; public procedure Add(map: TBoolMap); function Get: TBoolMap; protected function Perform(a,b:boolean):boolean; virtual; abstract; end; type TXORer = class(TBitOPer) private function Perform(a,b:boolean):boolean; inline; end; type TORer = class(TBitOPer) private function Perform(a,b:boolean):boolean; inline; end; Rufe ich das jedoch in einer Instanz auf (add ruft perform auf), bekomme ich einen "abstrakten Fehler". was muss ich ändern? Kann ich das inline halten? |
Re: Abstrakter Fehler
Hi,
Da fehlt das override hinter der Deklaration von perform() in den Ableitungen. Du wirst auch wahrscheinlich eine Warnung erhalten, weil perform() in den Unterklassen eine geringere Sichtbarkeit hat - solltest die Prozedur demnach also auch nach "protected" packen. mfG mirage228 |
Re: Abstrakter Fehler
OK. override verbietet aber inline :(
Und wieso ist public eine gernigere Sichtbarkeit als protected? protected heisst doch "nur von Nachfahren sichtbar" und public "von allen sichtbar"?! |
Re: Abstrakter Fehler
Zitat:
Delphi-Quellcode:
Also ich lese da "private" :mrgreen:
type TXORer = class(TBitOPer)
private function Perform(a,b:boolean):boolean; inline; end; type TORer = class(TBitOPer) private function Perform(a,b:boolean):boolean; inline; end; mfG mirage228 |
Re: Abstrakter Fehler
Zudem ist inline seit mindestens Delphi 7 als veraltet markiert. Du solltest lieber in der Methode asm benutzen.
Was die Sichtbarkeit angeht, so muss die Überschriebene Funktion mindestens Protected sein, da du die Sichtbarkeit (soweit ich weiß auch in Delphi) nicht vermindern kannst! Also musst du gleiche oder höhere Sichtbarkeit zulassen. private ist aber weniger als protected Gruß Der Unwissende |
Re: Abstrakter Fehler
Zitat:
seit Delphi 2005 kann "inline" für Funktions-inlining benutzt werden, das heisst, dass die Funktion nicht mehr aufgerufen, sondern direkt an die Stelle des aufrufs gesetzt wird. Das spart den Aufruf. ![]() Zitat:
mfG mirage228 |
Re: Abstrakter Fehler
ach so... äh ja.... :oops:
|
Re: Abstrakter Fehler
Ist das denn wirklich sooo schwer zu verstehen? :gruebel:
Kiek mal ![]() |
Re: Abstrakter Fehler
Sorry, dann bin ich wohl etwas zu wenig davon ausgegangen, dass Borland Tags wiederbelebt. Finde ich aber auch etwas ungewöhnlich, aber gut.
Ok, schau mir das nächste mal wohl lieber 2005 an, bevor ich hier etwas sage. |
Re: Abstrakter Fehler
Zitat:
Ich verstehe nur ncht, wie man nach so langer Zeit mit Delphi nicht weiß was virtual und override machen und warum inline damit nicht klarkommen kann. (deterministischer statischer compile vs. dyn. gebundenem virtual call) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz