Angewandte Mathematik und Programmierung



Ähnliche Dokumente
OOP und Angewandte Mathematik. Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik

Angewandte Mathematik und Programmierung

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Objektorientierte Programmierung. Kapitel 12: Interfaces

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 22

Vererbung & Schnittstellen in C#

Vorkurs C++ Programmierung

Programmieren in Java

Ziel, Inhalt. Programmieren in C++ Wir lernen wie man Funktionen oder Klassen einmal schreibt, so dass sie für verschiedene Datentypen verwendbar sind

Einführung in die Programmierung

1. Grundlegende Eigenscha5en 2. Redefini+on 3. Polymophie 4. Mehrfachvererbung

C++ - Einführung in die Programmiersprache Polymorphismus und Vererbung. Eltern

Java: Vererbung. Teil 3: super()

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

Grundlagen von Python

5. Abstrakte Klassen

Einführung in die Java- Programmierung

thorsten möller - informack.unibas.ch/lehre/fs13/cs109/06- c++- modgen.pdf Templates MoCvaCon

Objektorientierte Programmierung

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

3 Objektorientierte Konzepte in Java

Objektorientierte Programmierung OOP

Java Kurs für Anfänger Einheit 5 Methoden

Einführung in die Programmierung

Methoden. von Objekten definiert werden, Methoden,, Zugriffsmethoden und Read-Only

Klassendiagramm. Kurzer Überblick über UML - Stand BlaBla

GetName(), GetName(), GetGeschlecht() und AelterWerden().

Einführung in die Programmierung (EPR)

Kapitel 6. Vererbung

Objektorientierte Programmierung mit C++ Zusammenfassung der wichtigsten Topics rund um die objektorientierte Programmierung mit C++11

Folge 18 - Vererbung

Programmierkurs Java

Die Bedeutung abstrakter Datentypen in der objektorientierten Programmierung. Klaus Kusche, September 2014

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Kapitel 6. Vererbung

Prinzipien Objektorientierter Programmierung

Kapitel 6. Vererbung

12. Vererbung. Prof. Dr. Markus Gross Informatik I für D-ITET (WS 03/04)

Fakultät Angewandte Informatik Lehrprofessur für Informatik

Angewandte Mathematik und Programmierung

.NET Code schützen. Projekt.NET. Version 1.0

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur

2. Semester, 2. Prüfung, Lösung

SEP 114. Design by Contract

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

Programmieren - Vererbung & Polymorphie

Objektorientierte Programmierung

Klassenbeziehungen & Vererbung

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

13 OOP MIT DELPHI. Records und Klassen Ein Vergleich

Übungen zu C++ Kapitel 1

3. Konzepte der objektorientierten Programmierung

4D Server v12 64-bit Version BETA VERSION

C++ Grundlagen. ++ bedeutet Erweiterung zum Ansi C Standard. Hier wird eine Funktion eingeleitet

Objektorientiertes Programmieren für Ingenieure

Objektbasierte Entwicklung

Zählen von Objekten einer bestimmten Klasse

7. Objektorientierte Softwareentwicklung/3. Informatik II für Verkehrsingenieure

2. Programmierung in C

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

OO Softwareentwicklung

Einführung in die Java- Programmierung

Client-Server-Beziehungen

Computeranwendung und Programmierung (CuP)

1. Von der Idee zur Software 2. Funktionen und Datenstrukturen Lehrbuch: Organisation des Quellcodes 4. Werte- und Referenzsemantik

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

Arbeiten mit UMLed und Delphi

Informatik 2 Labor 2 Programmieren in MATLAB Georg Richter

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005

Sichtbarkeit & statische Methoden. Einsatz von Sichtbarkeit Einsatz statischer Methoden programmatische Realisierung 2 Beispielaufgaben

Programmiersprache 2 (C++) Prof. Dr. Stefan Enderle NTA Isny

Zum Abschluss wird gezeigt, wie aus einem C++ Quell-Programm ein ausführbares Programm erzeugt wird. 1. Installation von NetBeans...

Fachdidaktik der Informatik Jörg Depner, Kathrin Gaißer

Grundkonstrukte der Objektorientierung in Java, C# und C++

13. Tutorium zu Programmieren

Delegatesund Ereignisse

Grundlagen. Kapitel 1

Übung 9 - Lösungsvorschlag

Installation und Inbetriebnahme von Microsoft Visual C Express

Innere Klassen in Java

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 18

Klausur in Programmieren

Software Engineering Interaktionsdiagramme

Teil 9: Vererbung. Prof. Dr. Herbert Fischer Fachhochschule Deggendorf Prof. Dr. Manfred Beham Fachhochschule Amberg-Weiden

5.2 Neue Projekte erstellen

M. Graefenhan Übungen zu C. Blatt 3. Musterlösung

Programmierung und Angewandte Mathematik

Objektorientierte Programmierung mit Python Polymorphismus und Vererbung. Eltern

Abschnitt 12: Strukturierung von Java-Programmen: Packages

Objektorientiertes JavaScript

Vererbung und Polymorphismus

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Transkript:

Angewandte Mathematik und Programmierung Einführung in das Konzept der objektorientierten Anwendungen zu mathematischen Rechnens WS2013/14

Inhalt Übung(Aufklärung) Vererbung(wdh.) Initilisierung bei Vererbung Polymorphismus ( Untergliederung von Vererbung) Templates Standardkonversionsionen bei abgeleiteten Klassen Virtuelle Funktionen pure virtual - Funktionen und abstrakte Klassen Komplexes Pragrammbeispiel zum Einsatz von Vererbung Angewandte Mathematik und Programmierung 2

Initialisierung bei Vererbung Wenn wir nun ein Objekt einer abgeleiteten Klasse anlegen, stellt sich die Frage, wie werden dabei die ererbten Attribute der Basisklasse initialisiert. Dazu gibt es genaue Regeln für die Konstruktoren abgeleiteter Klassen. #include <iostream.h> class Konto { private: int KtoNr; //... public: // Defaultkonstruktor Konto () : KtoNr(999) { cout << "Konto(), KtoNr: " << KtoNr << endl; // Parameterkonstruktor Konto (int knr) : KtoNr(kNr) { cout << "Konto(int), KtoNr: " << KtoNr << endl; // Destruktor ~Konto() { cout << "~Konto(), KtoNr: " << KtoNr << endl; ; ; Angewandte Mathematik und Programmierung 3

Initialisierung bei Vererbung class Girokonto : public Konto { private: float Dispo; //... public: Girokonto () : Dispo(2000) { cout << "- Girokonto(), Disp.: " << Dispo << endl; Girokonto (float d) : Dispo(d) { cout << "- Girokonto(float), Disp.: " << Dispo << endl; Girokonto (int knr, float d) : Konto(kNr), Dispo(d) {cout << "- Girokonto(int,float), Disp.: " << Dispo << endl; ~Girokonto () { cout << "- ~Girokonto(), Disp.: " << Dispo << endl; ; void main() { Girokonto a, b(5500.0), c(123,1000.0); Angewandte Mathematik und Programmierung 4

Initialisierung bei Vererbung-Ausgaben Konto(), KtoNr: 999 - Girokonto(), Disp.: 2000 Konto(), KtoNr: 999 - Girokonto(float), Disp.: 5500 Konto(int), KtoNr: 123 - Girokonto(int,float), Disp.: 1000 - ~Girokonto(), Disp.: 1000 ~Konto() Konto(), KtoNr: 123 - ~Girokonto(), Disp.: 5500 ~Konto(), KtoNr: 999 -~Girokonto(), Disp.: 2000 ~Konto(), KtoNr: 999 Press any key to continue Angewandte Mathematik und Programmierung 5

Initialisierung bei Vererbung- Erkenntnisse Konstrukturen werden nicht vererbt! Reihenfolge der Destruktion: genau umgekehrt Komponenten von Basisklassen können nur über ihre Konstruktoren initialisiert werden. Der Konstruktoraufruf erfolgt entweder implizit: Defaultkonstruktor (falls vorhanden) oder muß explizit erfolgen: in der Initialisierungsliste Ein expliziter Konstruktoraufruf muß erfolgen, wenn Parameter übergeben werden sollen. Die Parameter müssen bei der Definition der abgeleiteten Klasse in der Initialisierungsliste unter dem Namen der Klasse angegeben werden. Girokonto (int knr, float d) : Konto(kNr), Dispo(d) Eine direkte Initialisierung ohne Konstruktoraufruf geerbter Attribute über die Initialisierungsliste ist nicht möglich! Rih Reihenfolge fl der Konstruktion: ki Basisklassen in der Reihenfolge ihrer Deklaration in der Ableitungsliste (nicht in der Initialisierungsliste), danach die Member der abgeleiteten Klasse in der Reihenfolge ihrer Deklaration. Angewandte Mathematik und Programmierung 6

Polymorphie Polymorphie bedeutet Vielgestaltigkeit. Der Begriff Polymorphie ist eng mit der Vererbung verbunden. Er bezeichnet die Tatsache, das eine Methode in verschiedenen abgeleiteten Klassen einer Hierarchie unterschiedlich h implementiert i werden kann. So ist es möglich, dass verschiedene Klassen gleichlautende Methoden enthalten, die aber nicht den gleichen Inhalt haben. Verschiedene hid Objekte Objkt werden gleich lih bh behandelt, dlt reagieren aber unterschiedlich. hidlih Sie können gleich behandelt werden, weil sie zum Teil gleiche Schnittstellen besitzen (gleichlautende Datenelemente und Methoden). 7

Polymorphie Methoden, die in mehreren Klassen benötigt werden, werden in einer Basisklasse deklariert. In den abgeleiteten Klassen werden sie dann überschrieben, um eine klassenspezifische Ausführung zu erreichen. Methoden, die überschrieben werden sollen, werden in der Basisklasse mit dem Schlüsselwort virtual deklariert, um sicher zu stellen, dass beim Aufruf auch wirklich die überschriebenen Methoden aufgerufen werden und nicht die der Basisklasse. Es ist üblich auch die überschriebenen Methoden in den abgeleiteten Klassen mit virtual zu kennzeichnen. Siehe Beispiel 8

Polymorphie und Methoden überschreiben class Auto { public: virtual void marke() = 0; ; Identischer Methoden kopf heißt, dass sowohl Sichtbarkeit, Rückgabewert, Methodenname und die Datentypen der Methodenparameter gleich lih sein müssen. class DeutschesAuto : public Auto{ public: virtual void marke(){cout << "VW" << endl; void fahre250() {cout << "geht nicht" << endl; ; class Audi : public DeutschesAuto{ public: virtual void marke(){ cout << "Audi" << endl; ; class Mercedes : public DeutchesAuto{ public: virtual void marke(){ cout << "Mercesdes" << endl; void fahre250(){ cout << "sicher!" << endl; ; Beim Auto-Beispiel wird die Methode marke von Auto in DeutschesAuto überschrieben, welche dann wiederum in den Klassen Audi und Mercedes überschrieben werden. fahre250 ist zum ersten mal in Deutsches Auto definiert i und wird in der Klasse Mercedes überschrieben, nicht aber in der Klasse Audi., und ist nicht virtuell. 9

Polymorphie // Zuweisung von Objekten in Main Mercedes m; DeutschesAuto da; da.marke(); // VW da.fahre250(); // geht nicht m.marke(); // Mercedes m.fahre250(); // sicher! // Zuweisung von Zeiger: in Main Mercedes m; m.marke(); // Mercedes m.fahre250(); // sicher! DeutchesAuto *da = &m; da->marke(); // Mercedes da->fahre250(); // geht nicht Bei Polymorphismus spricht man auch oft von early binding und late binding Early binding: bereits während des Kompilierens weiss man, welche Methode ausgeführt werden wird (statischer Typ): da.marke(); //VW Late binding: erst zur Laufzeit kennt man den dynamischen Typ und dadurch d die entsprechende Methode: da->marke(); //Mercedes Der Zusammenhang zwischen Polymorphismus und Methoden berschreiben ist ein wichtiger Aspekt von objektorientierten Programmiersprache In Java wird immer die Methode des dynamischen Typs angewendet In C++ wird das Verhalten durch den Programmierer bestimmt 10

Polymorphie und Methoden überschreiben Polymorphie ist i. A. nur dann sinnvoll, wenn zwischen den Objekten der Ober- und Unterklasse eine IS-A-Beziehung besteht. Methoden, die in mehreren Klassen benötigt werden, werden in einer Basisklasse deklariert. In den abgeleiteten Klassen werden sie dann überschrieben, um eine klassenspezifische Ausführung zu erreichen. Methoden, die überschrieben werden sollen, werden in der Basisklasse mit dem Schlüsselwort virtual deklariert, um sicher zu stellen, dass beim Aufruf auch wirklich die überschriebenen Methoden aufgerufen werden und nicht die der Basisklasse. Es ist üblich auch die überschriebenen Methoden in den abgeleiteten Klassen mit virtual zu kennzeichnen. Siehe Beispiele (Virtual und Polymorphie) 11

Polymorphie und Methoden überschreiben Überschreiben ist nicht Überladen Überladen von Methoden Verschiedene Methoden in einer Klasse (diese können auch von einer Oberklasse geerbt werden) besitzen den gleichen Namen. Die Signatur der Methoden muss eindeutig sein. Überschreiben von Methoden Neuimplementierung einer Methode in einer Unterklasse. Die neue Methode besitzt insbesondere die gleiche Signatur (Methoden kopf ) wie eine Methode der Oberklasse. Wird eine Methode überschrieben, ist die Methode der Superklasse in einer Instanz der Subklasse nicht mehr sichtbar und es wird die neue Version der Methode verwendet: 12

Abstrakte Klassen und Methoden Virtuelle Methoden können zusätzlich auch noch abstrakt sein. Eine abstrakte Klasse in C++, ist eine Klasse, die mindestens eine abstrakte Methode enthält. Von abstrakten Klassen können keine Objekte erzeugt werden. Eine abstrakte Methode in C++ ist virtuell und dadurch gekennzeichnet, dass ihre Deklaration durch " = 0; abgeschlossen wird (rein Virtuellen Methoden). Eine abstrakte Methode kann jedoch außerhalb der Klasse wie üblich noch implementiert sein. Fahrzeug.h class fahrzeug { public: virtual void fahren() = 0; ; #include "fahrzeug.h" #include <iostream> class automobil : public fahrzeug { public: ; void fahren() { std::cout << "Brummbrumm" << std::endl; 13

Abstrakte Klassen und Methoden Sinn abstrakter Klassen ist, dass ihre abstrakten Methoden in abgeleiteten Klassen reimplementiert werden müssen, um dort eine Instanzenbildung zuzulassen. Abstrakte Klassen verwendet man auch, um Schnittstellen in C++ zu definieren. Schnittstellen (Bitte beachte) In Java dürfen Klassen nur eine Superklasse besitzen, das bedeutet, daß die von C++ bekannte Mehrfachvererbung nicht möglich ist. Statt dessen kennt Java die sogenannten Interfaces. Das sind reine Schnittstellen, die keinerlei Implementierungen enthalten. 14

Abstrakte Klassen und Methoden C++ Java Abstrakte Klassen besitzen mindestens eine abstrakte Methode. Abstrakte Methoden können einen Rumpf besitzen. Abstrakte Klassen werden durch das Schlüsselwort abstract gekennzeichnet. Abstrakte Methoden besitzen keinen Rumpf. Empfehlung für abstrakte Klasse in C++ Der Destruktor sollte abstrakt deklariert werden. 15

Templates Programmiersprachen sollten elegante Mechanismen besitzen, um Redundanz beim Programmieren vermeiden zu können. Angenommen, wir wollen Listen-, Array, oder Matrizen-Klassen implementieren, die verschiedene Datentypen als Inhalt aufnehmen können(z.b. int, double, bool, usw ). Alle Operationen bleiben gleich: 1 2 3 1.3 2.5 4.3 true false true 4 5 6 3.4 5.2 6.3 true true true 7 8 9 1.2 4.5 7.2 false true false In C++ wird dieses Konzept Template genannt. Eine andere Bezeichnung g( (z.b. in Java 1.5) ist Generic. 16

Templates Motivation: Eine Klasse erstellen für verschiedene Datentypen Datenrepräsentation: Matrix, Stacks, Listen, Bäume... Code für einen Datentyp sollte für kompatible Typen wieder verwendbar sein. C++ bietet die Möglichkeit, mit Hilfe von Templates (Schablonen, Vorlagen) eine parametrisierte Familie verwandter Funktionen oder Klasse zu definieren Vorteile Funktions-Templates legen die Anweisung einer Funktion fest, wobei statt eines konkreten Typs ein Parameter T gesetzt wird Klassen-Templates legen die Definition einer Klasse fest, wobei statt eines Typs ein Parameter T eingesetzt wird. Ein Template muss nur einmal codiert werden. Einzelne Klassen oder Funktionen werden automatisch erzeugt. Einheitliche h Lösung für gleichartige Probleme, wobei man unabhängige Bestandteile frühzeitig testen kann 17

Templates template <class T> void swap (T& a, T& b) { T tmp = a; a = b; b = tmp; void swap (char & a, char & b) { char tmp = a; a = b; b = tmp; Programmierung und Angewandte Mathematik 18

Templates Funktions-Templates Beispiel: swap()-funktion Verhalten ist für jeden Typ gleich (elementar und andere) Ineffizient: schreibe für jeden Typ eine eigene überladene Funktion Lösung: definiere eine Schablone für die Funktion swap() für Typ <int> swap() für beliebigen Typ <T> void swap (int& a, int& b) { int tmp = a; a = b; b = tmp; template <class T> void swap (T& a, T& b) { T tmp = a; a = b; b = tmp; 19

Templates Die template <...> Zeile sagt dem Compiler: die folgende Deklaration o. Definition ist als Schablone zu verwenden. Ein Template erwartet als Argumente Platzhalter für Typen: Template-Parameter template <class T> void swap (T& a, T& b) { T tmp = a; a = b; b = tmp; Die Platzhalter innerhalb des Template werden später (noch vor der Übersetzung in Maschinensprache) durch spezifische Typen ersetzt 20

Templates Templates sollen den Aufwand für den Entwickler reduzieren: Templates werden vom Kompiler nach Bedarf in eine normale Funktion/Klasse gewandelt. Wird swap für 2 int-werte verwendet, so wird eine weitere Funktion erzeugt. Wird swap für 2 Auto-Werte verwendet, so wird eine weitere Funktion erzeugt. Beim Kompilieren findet auch die Typprüfung statt. Syntax für explizite it Spezialisierung i double d1 = 4.0, d2 = 2.0; swap<double>(d1, d2); Explizit bedeutet: der Programmierer spezifiziert ausdrücklich, mit welchem Typ die Templateparameter zu ersetzen sind. 21

Templates Implizite Spezialisierung double d1 = 4.0, d2 = 2.0; //Alles klar: T = double swap(d1, d2); double d1 = 4.0; float f1 = 10.0f; swap(d1, f1); Entweder Das geht nicht! Compiler meldet: no matching function for call to swap(double&, float&) swap<double>(d1, f1); Oder Implizite Typkonvertierung von <f1> swap(d1, double(f1)); Explizite Typkonvertierung von <f1> 22

Templates In vielen Anwendungen ist es nicht nur notwendig eine Funktion, sondern eine ganze Klasse mit einem Typ zu parametrisieren. Z.B.: Implementierung von elementaren Datenstrukturen wie Stack, Queue, binäre Suchbäume,usw. Stack Beispiel template <class T> class Stack { ; private: T* inhalt; // Datenbereich des Stacks int index, size; // Aktueller Index, Grösse des Stacks public: Stack(int s): index(-1), size(s) { // Constructor inhalt = new T[size]; // Stack als Array implementiert void push(t item) { if (index < (size - 1)) { inhalt[++index] = item; // Ein Element auf den Stack "pushen" T top() const { // Ein Element vom Stack lesen if (index >= 0) {return inhalt[index]; void pop() { // Ein Element auf dem Stack löschen if (index >= 0) {--index; 23

Templates Gebrauch der Template-Klasse Stack int main() { Stack<int> intstack(100); Stack<double> doublestack(250); Stack<rect> rectstack(50); intstack.push(7); doublestack.push(3.14); h(314) rectstack.push(rect(2,5)); // Stack für 100 int // Stack für 250 double // Stack für 50 rect Bei der Allozierung eines Stacks muss explizit der Typ angegeben g werden(<int>, <rect>,,...) Auch hier gilt: die entsprechende Klasse wird vom Compiler bei Bedarf aus der Template- Klasse generiert. 24

Templates Nochmals die Template-Klasse Stack, diesmal aber mit Trennung von Deklaration und Definition: Definition: stack.cpp Header-Datei: stack.h template <class T> class Stack { private: T* inhalt; int index; int size; public: Stack(int s); void push(type item); T top() const; void pop(); ; #include "stack.h" using namespace std; // Achtung: nicht Stack::Stack(int s)! template <class T> Stack<T>::Stack(int s):index(-1),size(s) size(s) { inhalt = new T[size]; template <class T> void Stack<T>::push(T item) { if(index<size) {inhalt[++index]=item; template <class T> T Stack<T>::top() const { if (index>=0) {return inhalt[index]; template <class T> void Stack<Type>::pop() { if (index >= 0) {index--; 25

Templates Gebrauch!!! #include "stack.cpp" " using namespace std; int main() { Stack<int> intstack(100); Stack<double> doublestack(250); intstack.push(7); doublestack.push(3.14); Man beachte: stack.cpp, nicht stack.h!!! Bei Templates muss die komplette Implementierung eingebunden werden, weil der Compiler die Klasse bei Bedarf erzeugt (Spezifikation allein reicht also nicht) Dies gilt auch für Template Funktionen; Die Funktionsdeklaration allein reicht nicht. 26

Templates Die Angabe des Datentyps beim Gebrauch eines Templates bestimmt, wofür eine Instanz des Templates gebraucht werden kann: Stack<Person> personstack(100); // Nur für Typ Person verwendbar Ausnahme: auch Subklassen von Person können auf diesem Stack abgelegt werden. Dabei werden die Objekte aber in Person konvertiert... wodurch die in Subklassen spezifizierte Funktionalität (und damit auch Polymorphismus) verloren geht. Besser: man verwendet einen Zeiger auf die Basisklasse: Vorteile: Polymorphismus funktioniert; Subklassen von Person können auf dem Stack abgelegt Stack<Person*> werden, personstack(100); ohne deren zusätzliche // Für alle Information verwendbar zu verlieren. 27

Templates Templates von Templates: Templates können als Parameter für andere Templates dienen: complex<float> c1, c2; swap<complex<float> >(c1, c2); complex<t> ist eine Klasse der C++ Standard Bibl. für Komplexe Zahlen (#include <complex>) Achtung: Bei geschachtelten Templates muss man aufeinander folgende > durch Leerzeichen trennen, da sie sonst als shift-operator missinterpretiert werden. 28

Templates Ein Template existiert nicht als Typ oder Objekt. Erst bei Instanziierung eines Template entsteht eine neuer Typ (Funktion/Klasse) bei dem die Template-Parameter durch konkrete Typen ersetzt wurden. Ohne Templates: werden Interface und Implementierung in separaten Dateien untergebracht (.h,.cpp) stellt der Linker die Verbindung zwischen dem Aufruf einer deklarierten Methode und dem zusätzlichen Maschinen-Code her. Mit Templates: wird Code erst bei Bedarf generiert. Bedarf heißt, z.b. durch Bindung an spezifische Template- Parameter kann nur der vom Template generierte Code übersetzt und gelinkt werden. 29