| Zitat: |
| Das macht mich irgendwie stutzig, denn "Free" ruft (nach einer Prüfung auf self <> nil) direkt Destroy auf. Wenn also Destroy korrekt durchläuft (und self also nicht nil ist), dann sollte auch Free zum Erfolg führen. Hast Du irgendwo "Free" überschrieben? |
Da sind wir wieder beim Thema Polymorphie!

Wenn der Destruktor nicht überschrieben ist, sondern ein statischer Destruktor den eigentlichen virtuellen verbirgt, kommt da ein anderes Resultat zustande, dann macht TXMLParser.Free eben nicht dasselbe wie TXMLParser.Destroy.
Free ist statisch, das kann nicht überschrieben werden.
@winx
Nimm doch mal folgendes Grundgerüst, vielleicht erkennst du dann deinen Fehler:
Interface:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| type TParser=class(TObject) public constructor Create; virtual; destructor Destroy; override; end;
type TXMLParser=class(TParser) public constructor Create; override; destructor Destroy; override; end;
type TXMLActionListPreParser=class(TXMLParser) public constructor Create; override; destructor Destroy; override; end; |
Implementation:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39:
| constructor TParser.Create; begin inherited; ShowMessage('TParser.Create'); end;
destructor TParser.Destroy; begin ShowMessage('TParser.Destroy'); inherited; end;
constructor TXMLParser.Create; begin inherited; ShowMessage('TXMLParser.Create'); end;
destructor TXMLParser.Destroy; begin ShowMessage('TXMLParser.Destroy'); inherited; end;
constructor TXMLActionListPreParser.Create; begin inherited; ShowMessage('TXMLActionListPreParser.Create'); end;
destructor TXMLActionListPreParser.Destroy; begin ShowMessage('TXMLActionListPreParser.Destroy'); inherited; end; |
Testaufruf:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure TForm15.Button1Click(Sender: TObject); var Parser:TObject; begin Parser:=TXMLActionListPreParser.Create; Parser.Free; end; |
Du solltest 6 Meldungen erhalten, für das Create und das Destroy je Instanz-Ebene eine Meldung.
Cu,
Udontknow