5.1 Was bedeutet Polymorphie?
Stellen wir uns vor, wir hätten eine Klasse A und leiten davon jeweils eine Klasse B und C ab. Jetzt wollen wir ein Feld oder eine Liste anlegen, die Zeiger auf Objekte von B und C enthält. Eine denkbare Anwendung wäre, dass A eine Vorlage für geometrische Objekte allgemein ist und B und C konkrete Formen wie Kreis oder Rechteck sind. Es macht keine Probleme solche Klassen allgemein zu definieren und abzuleiten. Wir rufen einfach zunächst die Funktionen aus der Basisklasse auf, bevor wir auf die Funktionen der abgeleiteten Klassen zurückgreifen. Wie aber legen wir Felder über Bs und Cs an? Angenommen, jede Klasse A, B und C hat eine eigene Funktion drucke():
A* feld[2];
B b;
C c;
a[0] = &b;
a[1] = &c;
a[0]->drucke(); a[1]->drucke();
Der Compiler erlaubt uns zwar die Typkonversion von \"Zeiger auf B\" in \"Zeiger auf A\", im entscheidenden Moment aber (wenn wir die Funktion drucke aufrufen) sieht er nur einen \"Zeiger auf A\" und ruft die zu A gehörige Funktion auf. Eine Tatsache, die uns das vernünftige Arbeiten mit solchen Feldern unmöglcih macht. Leider ist es aber in der Praxis seht häufig erforderlich, Listen oder Felder über mehrere Objekte unterschiedlicher abgeleiteter Klassen aufzumachen.
Bei diesem Problem helfen uns virtuelle Funktionen weiter. Wir definieren in A die Funktion drucke() als virtuell und teilen dem dadurch Compiler mit, dass er sich bitte darum zu kümmern hat, dass beim Aufruf der Funktion ggf. die Funktion aus der jeweils abgeleiteten Klasse zum Zug kommt:
class A
{ public:
virtual void drucke() { cout |