Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Vererbung: falsche Methode wird aufgerufen (https://www.delphipraxis.net/107658-vererbung-falsche-methode-wird-aufgerufen.html)

SebE 31. Jan 2008 11:02


Vererbung: falsche Methode wird aufgerufen
 
Einen guten Morgen an alle Delphi-/Pascal-Programmierer.

Problembeschreibung:
Es existieren zwei Objekte (obj_1 und obj_2), wobei obj_2 von obj_1 abgeleitet ist.

obj_1 besitzt 2 Methoden:
Delphi-Quellcode:
function F1(): TYPE_1
function F2(): TYPE_2

(* Tatsächliche Implementierung von obj_1.F1():
F2() //F1() ruft F2() auf
*)
obj_2 besitzt eine Methoden:
Delphi-Quellcode:
//F1() wird von obj_1 übernommen
function F2(): TYPE_2 //überschriebene Methode

(* Erwünschte Implementierung von obj_1.F1():
F2() //obj_1.F1() ruft obj_2.F2() auf
*)
In meinem Programm erzeuge ich eine Instanz von obj_2 und rufe obj_2.F1() auf.
Leider ruft obj_2.F1() intern jetzt nicht obj_2.F2(), sondern obj_1.F2() auf.

Was muss ich ändern, damit obj_2.F1() die "überschriebene" Methode obj_2.F2() aufruft?

Vielen DAnk für eure Hilfe

mkinzler 31. Jan 2008 11:05

Re: Vererbung: falsche Methode wird aufgerufen
 
Hast du die Methode wirklich überschrieben?

marabu 31. Jan 2008 11:06

Re: Vererbung: falsche Methode wird aufgerufen
 
Hallo Sebastian,

hast du denn darauf geachtet, dass F2() dann virtuell sein muss?

Grüße vom marabu

Bernhard Geyer 31. Jan 2008 11:14

Re: Vererbung: falsche Methode wird aufgerufen
 
Müsste da nicht auch eine Warnmeldung des Compilers kommen die dich auf den Fehler aufmerksam macht? :gruebel:

SebE 31. Jan 2008 11:18

Re: Vererbung: falsche Methode wird aufgerufen
 
OK,

Delphi-Quellcode:
obj_1.F2(); virtual;
Delphi-Quellcode:
obj_2.F2(); override;
Jetzt funktioniert's, aber, was wäre, wenn ich obj_1 nicht ändern könnte oder nicht ändern will, weil ich das Objekt für andere Zwecke nutze?

Gibt es keine andee Möchlichkeit?

Wieso wird denn die Methode nicht einfach überschrieben, wenn man im abgeleitetem Objekt den gleichen Methoden-Namen verwendet?

mkinzler 31. Jan 2008 11:20

Re: Vererbung: falsche Methode wird aufgerufen
 
Zitat:

Wieso wird denn die Methode nicht einfach überschrieben, wenn man im abgeleitetem Objekt den gleichen Methoden-Namen verwendet?
Weil nur virtuelle Methoden Einträge in der VMT bekommen und nur dann überschrieben werden können.

SebE 31. Jan 2008 11:24

Re: Vererbung: falsche Methode wird aufgerufen
 
Angenommen man verzichtet auf virtual: existieren dann beide Methoden?

und: ist das nur in Delphi oder gilt das auch für "normales" ObjectPascal?

Is ein echt interessantes Thema, freu mich auf Antworten

sirius 31. Jan 2008 11:41

Re: Vererbung: falsche Methode wird aufgerufen
 
Im Exe-Code existieren immer alle Methoden. Also alles was du implementiert hast (außer wenn Delphi was optimiert hat, aber das hat rein gar nix mit OOP zu tun) wird übersetzt.

Der Unterschied, ob du deine Methode virtuell machts oder nicht, ist, dass sie einen Eintrag in die VMT bekommt. Dat is jetzt auch noch nicht spannend. Aber Ein Aufruf dieser Methode wird spannend. Wenn du eine statische Methode hast, dann wird sie einfach direkt über ihre Adresse aufgerufen. Also ruft die Methode obj1.F1 immer obj1.F2 auf. Da steht direkt ein Pointer auf die Zeile im Code wo obj1.F2 ist.
Wenn F2 virtuel ist, dann wird der Aufruf auch dynamsich. Dann wird in F1 implementiert, dass bitte IMMER zuerst in der VMT nachgesehen wird, welche Methode von F2 grad am drannsten ist.

phXql 31. Jan 2008 11:53

Re: Vererbung: falsche Methode wird aufgerufen
 
Zitat:

Zitat von SebE
Wieso wird denn die Methode nicht einfach überschrieben, wenn man im abgeleitetem Objekt den gleichen Methoden-Namen verwendet?

Sie wird verdeckt. Wenn Obj1 die Methode aufruft, wird auch die Implementierung von Obj1 genommen. Wenn Obj2 sie aufruft, wird die implementierung von Obj2 benutzt. Wenn du die Methode als virtual definierst und override angibst, dann benutzt auch Obj1 die Implementation von Obj2. Das is übrigens auch in z.B, C# so...

SebE 31. Jan 2008 15:56

Re: Vererbung: falsche Methode wird aufgerufen
 
Ich danke euch...jetzt hab ich ein besseres Verständnis dafür

Großes Lob an die DP und ihre Mitglieder :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:09 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-2025 by Thomas Breitkreuz