Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   "class of"-Methaobjekt ruft falschen Konstruktor auf? (https://www.delphipraxis.net/182223-class-methaobjekt-ruft-falschen-konstruktor-auf.html)

Patrick 10. Okt 2014 08:41

Delphi-Version: 5

"class of"-Methaobjekt ruft falschen Konstruktor auf?
 
Moin, ich habe folgendes Problem (etwas vereinfacht dargestellt):

Delphi-Quellcode:
type
   TStrasse = class(TObject)
   private
      Rand : string;
   public
      constructor Create;
   end;
   
   TBundesstrasse = class(TStrasse)
   public
      constructor Create;
   end;
   
   TStrasseClass = class of TStrasse;
   
...

constructor TStrasse.Create;
begin
  Rand := 'Bordstein';
end;

constructor TBundesstrasse.Create;
begin
  inherited Create;
  Rand := 'Graben';
end;   
   
...   
   
var
   StrasseClass : TStrasseClass;
   Strasse : TStrasse;   
begin
   StrasseClass := TBundesstrasse;
   Strasse := StrasseClass.Create;
   
//   Strasse.Rand = Bordstein!?
end;
Warum wird der Constructor von TBundesstrasse nicht aufgerufen?

Uwe Raabe 10. Okt 2014 08:43

AW: "class of"-Methaobjekt ruft falschen Konstruktor auf?
 
Zitat:

Zitat von Patrick (Beitrag 1275506)
Warum wird der Constructor von TBundesstrasse nicht aufgerufen?

Weil der Constructor von TStrasse nicht
Delphi-Quellcode:
virtual
und der von TBundesstrasse nicht
Delphi-Quellcode:
override
ist.

Der schöne Günther 10. Okt 2014 08:44

AW: "class of"-Methaobjekt ruft falschen Konstruktor auf?
 
Weil du den Konstruktor nicht virtuell gemacht hast.

Edit: Kein roter Kasten, ich schwöre es!

DeddyH 10. Okt 2014 08:54

AW: "class of"-Methaobjekt ruft falschen Konstruktor auf?
 
Und genau das ist der Unterschied zwischen Überschreiben und Verdecken.

Patrick 10. Okt 2014 09:05

AW: "class of"-Methaobjekt ruft falschen Konstruktor auf?
 
Danke für eure Antworten.

Ich dachte immer es wäre schlechter Stil den Konstruktor zu überschreiben.
Sollte nicht
Delphi-Quellcode:
   StrasseClass := TBundesstrasse;
   Strasse := StrasseClass.Create;
und
Delphi-Quellcode:
   Strasse := TBundesstrasse.Create;
das gleiche sein?

Stevie 10. Okt 2014 09:15

AW: "class of"-Methaobjekt ruft falschen Konstruktor auf?
 
Zitat:

Zitat von Patrick (Beitrag 1275514)
Danke für eure Antworten.

Ich dachte immer es wäre schlechter Stil den Konstruktor zu überschreiben.
Sollte nicht
Delphi-Quellcode:
   StrasseClass := TBundesstrasse;
   Strasse := StrasseClass.Create;
und
Delphi-Quellcode:
   Strasse := TBundesstrasse.Create;
das gleiche sein?

Nein, weil ohne virtuellen Konstruktor in TStrasse der Aufruf von StrasseClass.Create einen statischen Methodenaufruf von TStrasse.Create macht und keinen virtuellen auf den Konstruktor der konkreten TStrasseClass.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:31 Uhr.

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