- Inkapsulation und Erweiterungsfaehigkeit der Typen
- Vererbung
- Polymorphismus
- Überladen
- Virtuelle Funktionen
- Statische Klassenmitglieder
- Funktionstemplates
- Klassentemplates
- Abstrakte Klassen
Polymorphismus
Polymorphismus ist die Moeglichkeit für Objekte verschiedener Klassen verbunden durch Vererbung beim Zugriff zu derselben Funktion-Element verschieden zu reagieren. Das hilft, universelle Mechanismen zu schaffen, die nicht nur das Verhalten der Basisklasse beschreiben, sondern auch das Verhalten der Klassen-Nachfolger.
Setzen wir die Ausarbeitung der Basisklasse CShape fort, in der wir die Funktion-Glied GetArea() definieren, die für Berechnung der Figurflaeche bestimmt ist. In allen Klassen-Nachfolger, erzeugt durch Vererbung von der Basisklasse, definieren wir die Funktion entsprechend den Regeln der Flaechenberechnung für konkrete Figur um.
für Quadrat (Klasse CSquare) wird die Flaeche durch Seiten, für Kreis (Klasse CCircle) durch Radius berechnet usw. Wir können Feld schaffen für Speichern von Objeketen des Typs CShape, in dem sowohl das Objekt der Basisklasse, als auch alle ihre Nachfolger gespeichert werden können. Im Nachhinein können wir dieselbe Funktion für jedes Element dieses Feldes aufrufen.
Beispiel:
//--- Basisklasse
|
Jetzt haben alle Variablen die Funktion-Glied getArea(), die Nullwert zurückgibt. Realisierung dieser Funktion wird in jedem Nachfolger verschieden sein.
//--- sekundaere Klasse Kreis
|
Für Quadrat sieht Klassenerklärung ähnlich aus:
//--- sekundaere Klasse Quadrat
|
Da für Berechnung des Quadrats und des Kreises entsprechende Werte der Gliesder m_radius und m_square_side notwendig sind, haben wir in der Erklärung der entsprechenden Klassen Funktionen SetRadius und SetSide() zugesetzt.
Es wird davon ausgegangen, dass in unserem Programm Objekte der verschiedenen Typen (CCircle und CSquare) abgeleitet von einem Basistyp CShape verwendet werden. Polymorphismus erlaubt die Erstellung eines Arrays von Objekten der Basisklasse CShape, aber bei der Deklaration von diesem Array sind diese Objekte noch nicht bekannt und ihre Typ nicht definiert ist.
Die Entscheidung, welcher Typ von Objekt wird in jedem Element des Arrays enthalten sein werden direkt während der Programmausführung genommen werden. Dies beinhaltet die dynamische Erstellung von Objekten der entsprechenden Klassen, und damit die Notwendigkeit, Objekt Zeiger anstelle von Objekten zu verwenden..
Das new-Array ist für die dynamische Erzeugung von Objekten eingesetzt. Jedes solches Objekt muss einzeln und explizit mit dem Operator delete gelöscht werden. Deshalb erklären wir ein Array den Zeigern von CShape Typ, und erstellen wir ein Objekt einer richtigen Typ für jedes Element (new Klassname), wie im folgenden Skript Beispiel gezeigt:
//+------------------------------------------------------------------+
|
Beachten Sie, dass wenn das Object mit dem Operator delete gelöscht wird, der Typ seinen Zeiger überprüfen werden soll. Nur Objekte mit dem Zeiger POINTER_DYNAMIC kann durch delete gelöscht werden. Für andere Typen wird ein Fehler zurückgegeben.
Ausser Umdefinieren der Funktion bei der Vererbung schließt Polymorphismus auch Realisierung derselben Funktion mit verschiedenem Parametervorrat innerhalb einer Klasse. Das bedeutet in der Klasse können mehrere Funktionen mit demselben Namen, aber verschiedenem Parametertyp/Parametervorrat definiert werden. In diesem Fall wird Polymorphismus durch Funktionüberladen realisiert.
Sehen Sie auch