[linux-l] Re: C++ - <vector> ...

Axel Weiß aweiss at informatik.hu-berlin.de
Di Mai 31 22:45:53 CEST 2005


Am Sonntag, 29. Mai 2005 12:46 schrieb JSC:
> polymorphie und templates sind dasselbe? in meinem verstaubten buch
> "Breymann: C++ Eine Einfuehrung" stehen virtuelle funktionen unter
> der ueberschrift polymorphie. und virtuelle funktionen glaubte ich
> verstanden zu haben :-(
>
> ich werde lesen. kann mich aber vage erinnern, dass ich das schon zu
> studiumszeiten templates nicht vollstaendig verstanden haben und als
> komplett unlesbar eingestuft habe.

Hi Jens,

virtuelle Klassen (Klassen mit virtuellen Methoden) implementieren das 
Konzept des 'späten Bindens' (late binding) von Methoden und sind ein 
Teil der Vererbungs-Konzepte. (BTW: virtuelle Funktionen gibt es nicht.) 
Damit lassen sich heterogene Objekt-Mengen konsistent handhaben.

Templates sind Klassenschablonen, die einen oder mehrere Parameter 
besitzen (Parameter können Zahlen oder Typen sein). Bei der 
Instanzierung eines Templates werden seine Parameter mit konkreten 
Werten/Typen belegt und eine neue Klasse generiert (mit Objektcode und 
allem was dazugehört).

Der prägnanteste Unterschied zwischen virtuellen Klassen und Templates 
liegt darin, was sie bereitstellen: virtuelle Klassen bieten ein 
Interface - Templates bieten eine Implementierung.

Zum Beispiel Listen (langweilig, aber als Beispiel beliebt). Soll die 
Implementierung einer Ur-Liste 'vererbt' werden, bietet sich das 
Template-Konzept an: die Algorithmen zum Einfügen, Suchen, Sortieren, 
Löschen usw. sind in allen Listen die selben - ob sie Zahlen, Strings 
oder andere Objekte enthalten. Auf der anderen Seite ist eine Liste mit 
Strings etwas anderes als eine Liste mit Zahlen, und ich kann die eine 
nicht anstelle der anderen verwenden, oder gar mischen. Das 
Listen-Template enthält die Algorithmen, und die Instanzierung mit 
Zahlen und Strings erzeugt zwei neue, verschiedene Klassen.

Etwas ganz anderes ist es, wenn ich eine Liste haben will, die Zahlen und 
Strings enthält, also heterogen ist. Hier braucht man eine virtuelle 
Elementklasse (mit der das Listen-Template dann instanziert wird), und 
davon erbende Elementklassen, die einmal Zahlen, das andere Mal Strings 
repräsentieren. Die virtuelle Elementklasse bietet ein Interface (z.B. 
zum Vergleichen) an, das die erbenden Klassen implementieren (was nichts 
mehr mit den Listen-Algorithmen zu tun hat).

Viele C++-Compiler können heute noch nicht beide Konzepte mischen, also 
Templates mit virtuellen Methoden akzeptieren. Darum sollte man davon 
die Finger lassen, wenn man portablen Code schreiben will.

BTW: Sun arbeitet seit einigen Jahren daran, Templates für Java 
anzubieten. Weiß hier jemand, ob daraus was geworden ist?

Gruß,
			Axel

-- 
Humboldt-Universität zu Berlin
Institut für Informatik
Signalverarbeitung und Mustererkennung
Dipl.-Inf. Axel Weiß
Rudower Chaussee 25
12489 Berlin-Adlershof
+49-30-2093-3050
** www.freesp.de **



Mehr Informationen über die Mailingliste linux-l