05.11.2013 Aufrufe

Vergleich von Delphi und Visual C++ - Inhalt

Vergleich von Delphi und Visual C++ - Inhalt

Vergleich von Delphi und Visual C++ - Inhalt

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

<strong>Vergleich</strong> <strong>von</strong> <strong>Delphi</strong> <strong>und</strong> <strong>Visual</strong> <strong>C++</strong> - Kapitel 2C<br />

2.3.6.4 Methoden <strong>und</strong> spezielle Felder<br />

Methoden sind Prozeduren oder Funktionen, deren Funktionalität fest mit einer Klasse verknüpft ist. Methoden werden üblicherweise in<br />

Verbindung mit einer Instanz der Klasse aufgerufen. Bei Klassenmethoden ist auch ein Aufruf in Verbindung mit einer Klasse möglich.<br />

Alle Methoden, die in einer Klasse deklariert werden, sind standardmäßig statisch (nicht zu verwechseln mit static!). Die Adresse der<br />

aufzurufenden Methode steht bereits zur Compilierzeit fest <strong>und</strong> kann vom Linker fest in das Programm eingetragen werden. Statische<br />

Methoden entsprechen in dieser Hinsicht gewöhnlichen Funktionen <strong>und</strong> Prozeduren außerhalb <strong>von</strong> Klassen. In <strong>C++</strong> sind alle Konstruktoren<br />

statische Methoden.<br />

Virtuelle Methoden werden in beiden Sprachen mit Hilfe des Wortes "virtual" deklariert. Die Adresse des Funktions-Aufrufes steht bei<br />

ihnen nicht bereits zur Zeit der Compilierung fest. Statt dessen wird die exakte Methoden-Adresse erst zur Laufzeit des Programms<br />

ermittelt.<br />

Wird in <strong>C++</strong> eine virtuelle Funktion in einer abgeleiteten Klasse neu definiert, dann ist auch diese Version der Funktion automatisch<br />

virtuell. Eine weitere Angabe <strong>von</strong> virtual ist erlaubt, aber nicht unbedingt nötig. In Object Pascal wird dagegen nur bei der Erstdeklaration<br />

einer virtuellen Funktion der Methodenzusatz virtual angegeben. Wird eine virtuelle Funktion in einer abgeleiteten Klasse neu definiert,<br />

dann muß hier durch Angabe des Wortes "override" kenntlich gemacht werden, daß diese Funktion eine neue Implementierung der<br />

virtuellen Basisfunktion darstellt. Andernfalls wird die neue Funktion als statische Funktion interpretiert <strong>und</strong> überschreibt (versteckt) die<br />

virtuelle Funktion. Wird in einer abgeleiteten Klassen eine bisher existierende, virtuelle Funktion erneut deklariert <strong>und</strong> mit dem Bezeichner<br />

virtual versehen, so geht in Object Pascal die Beziehung zur bisherigen virtuellen Funktionen verloren. Es wird vielmehr eine neue virtuelle<br />

Funktion erzeugt, welche die bisherige überschreibt (versteckt).<br />

Die einmal festgelegte Liste formaler Parameter muß beim Überschreiben einer virtuellen Methode beibehalten bleiben. In <strong>C++</strong> können<br />

zwar alle Methoden überladen werden, also mit gleichem Namen, aber veränderten Parametern neu definiert werden. Allerdings geht beim<br />

Überladen virtueller Methoden die polymorphe Beziehung zu möglichen Vorfahr-Methoden verloren. Es können also beim Überladen<br />

höchstens neue virtuelle Funktionen erstellt werden.<br />

V<strong>C++</strong><br />

class Figur{<br />

public:<br />

void virtual print();<br />

};<br />

class Rechteck : public Figur{<br />

void virtual print();<br />

};<br />

class R<strong>und</strong>Rechteck : public Rechteck{<br />

void virtual print();<br />

};<br />

void Figur::print()<br />

{<br />

printf("Ich bin die Figur");<br />

};<br />

void Rechteck::print()<br />

{<br />

printf("Ich bin ein<br />

Rechteck");<br />

};<br />

void R<strong>und</strong>Rechteck::print()<br />

Object Pascal<br />

type<br />

Figur = class<br />

procedure print; virtual;<br />

end;<br />

Rechteck = class(Figur)<br />

procedure print; override;<br />

end;<br />

R<strong>und</strong>Rechteck = class(Rechteck)<br />

procedure print; override;<br />

end;<br />

procedure Figur.Print;<br />

begin<br />

writeln('Ich bin die Figur');<br />

end;<br />

procedure Rechteck.Print;<br />

begin<br />

writeln('Ich bin ein<br />

Rechteck');<br />

end;<br />

http://ourworld.compuserve.com/homepages/praxisservice/kapit2c.htm (13 of 33) [19.05.2000 15:30:15]

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!