[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