Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Warum virtuelle Destructoren? (https://www.delphipraxis.net/86842-warum-virtuelle-destructoren.html)

JasonDX 19. Feb 2007 00:54

Re: unsichtbare Klassen
 
Zitat:

Zitat von Hansa
Ja, was soll denn überschrieben werden ? :shock: Da ist doch nichts vorher.

Ich weiss ja nicht, wie's bei dir aussieht, aber mein TObject hat sowas drinstehn:
Delphi-Quellcode:
destructor Destroy; virtual;
;)

greetz
Mike

Hansa 19. Feb 2007 01:04

Re: unsichtbare Klassen
 
Jason, ich meine das hier :

Delphi-Quellcode:
type
  TFIFO = class
        destructor Destroy; override;
      end;
Delphi wird das schon schlucken. Nur, was soll das ?

JasonDX 19. Feb 2007 01:15

Re: unsichtbare Klassen
 
Zitat:

Zitat von Hansa
Nur, was soll das ?

So wies aussieht soll das den virtuellen Destruktor ueberschreiben. :stupid:

greetz
Mike

Hansa 19. Feb 2007 01:25

Re: unsichtbare Klassen
 
Dann zeige mal wo der sein soll. :zwinker: Mittlerweile auch gemerkt, dass da was nicht stimmt ? :mrgreen: Oder, was habe ich in Object-Pascal wann verpasst ?

Dax 19. Feb 2007 01:31

Re: unsichtbare Klassen
 
In TObject? :gruebel:

JasonDX 19. Feb 2007 01:31

Re: unsichtbare Klassen
 
Zitat:

Zitat von Hansa
Dann zeige mal wo der sein soll. :zwinker:

Spielen wir grad blinde Kuh? :gruebel:
Hier hab ichs schon mal geschrieben: TObject enthaelt einen virtuellen Destruktor:
Delphi-Quellcode:
Type
  TObject = Class
  Public
    destructor destroy;virtual;
greetz
Mike

Hansa 19. Feb 2007 01:46

Re: unsichtbare Klassen
 
Blinde Kuh ? Ja wär doch gut. :lol:

Nächster Versuch :

Delphi-Quellcode:
type
  TFIFO = class
  private
    Type
      TNode = class
      private
        FNext: TNode;
        FObject: TObject;

      public
        constructor Create(AObject: TObject);
        destructor Destroy; override;
      end;
Erkläre mir mal bitte, warum da ein Destructor einer leeren Class TFIFO (also ohne Vorfahr) per override überschrieben werden muss. Mehr will ich gar nicht wissen. Wer soll mit dem "override" denn überhaupt angesprochen werden ? :shock:

JasonDX 19. Feb 2007 01:49

Re: unsichtbare Klassen
 
Zitat:

Zitat von Hansa
Erkläre mir mal bitte, warum da ein Destructor einer leeren Class TFIFO (also ohne Vorfahr) per override überschrieben werden muss. Mehr will ich gar nicht wissen. Wer soll mit dem "override" denn überhaupt angesprochen werden ? :shock:

Wenn nicht anders angegeben, wird jede Klasse von TObject abgeleitet und erbt damit all ihre Methoden. Inklusive dem virtuellen Destruktor, der dann ueberschrieben wird.

gute Nacht
Mike

Muetze1 19. Feb 2007 02:30

Re: unsichtbare Klassen
 
Ich hänge dazu nochmal schnell die Meinung der OH an, welches dies auch ausdrücklich beschreibt:
Zitat:

Zitat von oh
Wenn Sie in der Deklaration eines Klassentyps keinen Vorfahren angegeben, erbt die Klasse direkt von TObject. Aus diesem Grund ist die Deklaration

Delphi-Quellcode:
TMyClass = class
 ...
end;
identisch mit

Delphi-Quellcode:
type TMyClass = class(TObject)
 ...
end;
Die zweite Variante verdient jedoch aus Gründen der Lesbarkeit den Vorzug.

@Hansa: Bei C++ bzw. speziell dem BCB wäre es wichtig bzw. ein Unterschied für die VCL Klassen bzw. C++ Klassen. Diese können auch nicht vermischt werden, aber in Delphi gibt es immer nur die VCL Klassen, und die erben grundsätzlich von TObject, wenn nicht explizit anders angegeben.

/EDIT: Wenn du das Override nicht angibst, dann erhälst du zum einen einen Hinweis/Warnung vom Compiler und zum anderen wird dein Destructor nie ausgeführt.

IngoD7 19. Feb 2007 09:09

Re: unsichtbare Klassen
 
Zitat:

Zitat von Muetze1
/EDIT: Wenn du das Override nicht angibst, dann erhälst du zum einen einen Hinweis/Warnung vom Compiler und zum anderen wird dein Destructor nie ausgeführt.

Das bedarf aber noch ein paar Erklärungen. ;-)

Er wird nur dann nicht ausgeführt, wenn zum Freigeben von TMeinObjekt ein MeinObjekt.Free benutzt wird. Free ist von TObject geerbt und ruft eben nur den Destruktor destroy von TObject auf, wenn dessen Virtualität nicht Rechnung getragen wird in den abgeleiteten Klassen. Durch ein override würde MeinObjekt.Free den Destructor destroy von TMeinObjekt aufrufen. Daher sollten Destruktoren in der Regel immer ihren Ahnen per override überschreiben. Eben weil sonst ein Free den eigenen Destruktor nicht "erreichen" würde, sondern in TObject "hängenbleiben" würde.

Nun kann man aber locker auch den Destruktor direkt aufrufen, um ein TMeinObjekt freizugeben: MeinObjekt.Destroy.
In diesem Fall würde der Destruktor von TMeinObjekt immer aufgerufen werden, ohne jegliche Relevanz dessen, ob er seinen Ahnen in TObject überschreibt oder nicht.
Allerdings ist diese Art des Destruktoren-Aufrufs nicht sooo sonderlich empfehlenswert, weil zuvor überprüft werden muss, ob MeinObjekt nicht schon nil ist. Nichts anderes macht nämlich TObject.Free. :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:50 Uhr.
Seite 2 von 4     12 34      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz