AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Vererbung: falsche Methode wird aufgerufen
Thema durchsuchen
Ansicht
Themen-Optionen

Vererbung: falsche Methode wird aufgerufen

Ein Thema von SebE · begonnen am 31. Jan 2008 · letzter Beitrag vom 31. Jan 2008
Antwort Antwort
SebE

Registriert seit: 31. Jul 2004
Ort: Chemnitz
316 Beiträge
 
Delphi 7 Personal
 
#1

Vererbung: falsche Methode wird aufgerufen

  Alt 31. Jan 2008, 11:02
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
Sebastian
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Vererbung: falsche Methode wird aufgerufen

  Alt 31. Jan 2008, 11:05
Hast du die Methode wirklich überschrieben?
Markus Kinzler
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: Vererbung: falsche Methode wird aufgerufen

  Alt 31. Jan 2008, 11:06
Hallo Sebastian,

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

Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Vererbung: falsche Methode wird aufgerufen

  Alt 31. Jan 2008, 11:14
Müsste da nicht auch eine Warnmeldung des Compilers kommen die dich auf den Fehler aufmerksam macht?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
SebE

Registriert seit: 31. Jul 2004
Ort: Chemnitz
316 Beiträge
 
Delphi 7 Personal
 
#5

Re: Vererbung: falsche Methode wird aufgerufen

  Alt 31. Jan 2008, 11:18
OK,

obj_1.F2(); virtual; 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?
Sebastian
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Vererbung: falsche Methode wird aufgerufen

  Alt 31. Jan 2008, 11:20
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.
Markus Kinzler
  Mit Zitat antworten Zitat
SebE

Registriert seit: 31. Jul 2004
Ort: Chemnitz
316 Beiträge
 
Delphi 7 Personal
 
#7

Re: Vererbung: falsche Methode wird aufgerufen

  Alt 31. Jan 2008, 11:24
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
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Vererbung: falsche Methode wird aufgerufen

  Alt 31. Jan 2008, 11:41
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von phXql
phXql

Registriert seit: 11. Mär 2004
Ort: Mühldorf
824 Beiträge
 
#9

Re: Vererbung: falsche Methode wird aufgerufen

  Alt 31. Jan 2008, 11:53
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...
"Dunkel die andere Seite ist"
"Yoda! Halts Maul und iss deinen Toast!"
  Mit Zitat antworten Zitat
SebE

Registriert seit: 31. Jul 2004
Ort: Chemnitz
316 Beiträge
 
Delphi 7 Personal
 
#10

Re: Vererbung: falsche Methode wird aufgerufen

  Alt 31. Jan 2008, 15:56
Ich danke euch...jetzt hab ich ein besseres Verständnis dafür

Großes Lob an die DP und ihre Mitglieder
Sebastian
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:27 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