![]() |
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:
obj_2 besitzt eine Methoden:
function F1(): TYPE_1
function F2(): TYPE_2 (* Tatsächliche Implementierung von obj_1.F1(): F2() //F1() ruft F2() auf *)
Delphi-Quellcode:
In meinem Programm erzeuge ich eine Instanz von obj_2 und rufe obj_2.F1() auf.
//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 *) 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 |
Re: Vererbung: falsche Methode wird aufgerufen
Hast du die Methode wirklich überschrieben?
|
Re: Vererbung: falsche Methode wird aufgerufen
Hallo Sebastian,
hast du denn darauf geachtet, dass F2() dann virtuell sein muss? Grüße vom marabu |
Re: Vererbung: falsche Methode wird aufgerufen
Müsste da nicht auch eine Warnmeldung des Compilers kommen die dich auf den Fehler aufmerksam macht? :gruebel:
|
Re: Vererbung: falsche Methode wird aufgerufen
OK,
Delphi-Quellcode:
obj_1.F2(); virtual;
Delphi-Quellcode:
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?
obj_2.F2(); override;
Gibt es keine andee Möchlichkeit? Wieso wird denn die Methode nicht einfach überschrieben, wenn man im abgeleitetem Objekt den gleichen Methoden-Namen verwendet? |
Re: Vererbung: falsche Methode wird aufgerufen
Zitat:
|
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 |
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. |
Re: Vererbung: falsche Methode wird aufgerufen
Zitat:
|
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