Frage zu Polymorphismus
-
Hallo zusammen,
folgender Quelltext ist gegeben:
#include <iostream> using namespace std; class Test { protected: int x,y; Test(int a, int b) :x(a), y(b) {} public: virtual void berechnen(void)= 0; };Hierzu soll die folgende Frage beantwortet werden:
Was ist das besondere an der Klasse Test und wie nennt man solche Klassen?
Ich würde folgendes sagen:
- der Konstruktor ist protected. Das bedeuetet ja, dass man aus dieser Klasse heraus keine Instanz erstellen kann, sondern nur eine Klasse ableiten kann und dann aus der abgeleiteten Klasse eine Instanz erstellen? Beim instanziieren der abgeleiteten Klasse wird dann der Konstruktor der Basisklasse aufgerufen?
- durch die virtual Methode wird Polymorphismus dargestellt, das bedeutet, es wird erst zur Laufzeit entschieden, welche Methode aufgerufen wird. So können z.B. von abgeleiteten Klasse weitere Klassen wie "TestTest" oder "TestTestT" erstellt werden.
Sie alle erben von der Klasse Test.
Zur Laufzeit wird entschieden, welches Objekt die Methode aufruft, also z.B.:Test* testen [5]; testen[0] = new TestTest(2,3); testen[1] = new TestTestT(5,6); testen[0]->berechnen(); testen[1]->berechnen();Allerdings muss in den abgeleiteten Klassen jeweils eine Methode virtual void berechnen enthalten sein.
- Die Klasse wird abstrakte Klasse bezeichnet
Stimmen meine Ausführungen so?
Danke!
Viele Grüße
-
Maddin11 schrieb:
- durch die virtual Methode wird Polymorphismus dargestellt, das bedeutet, es wird erst zur Laufzeit entschieden, welche Methode aufgerufen wird
Das virtual ist aus meiner Sicht kein Kriterium für Polymorphismus. Man spricht von Polymorphismus, weil alle Klassen, die von Test ableiten, selber auch vom Typ "Test" sind. Sie sind eifach spezialisierte Typen von test.
Das mit den virtual Funktionen nennt man Late Binding oder auch Dynamic Binding.Der Rest sollte korrekt sein.
-
Was noch wichtig ist, ist das "=0" hinter der Methodendefinition - das besagt, daß die Methode pur virtuell ist (d.h. Test hat keine Definition dazu). Und diese pur virtuelle Methode sorgt schon alleine dafür, daß die Klasse abstrakt ist und du keine Instanzen davon erzeugen kannst.
(der geschützte Konstruktor hat darauf auch keinen weiteren Einfluß)
-
also das erste, was mir dazu eingefallen ist: gefährlich.
der klasse fehlt nämlich ein (virtueller) destruktor.
-
icarus2 schrieb:
Maddin11 schrieb:
- durch die virtual Methode wird Polymorphismus dargestellt, das bedeutet, es wird erst zur Laufzeit entschieden, welche Methode aufgerufen wird
Das virtual ist aus meiner Sicht kein Kriterium für Polymorphismus.
Wie erreichst du dann polymorphes Verhalten?
icarus2 schrieb:
Man spricht von Polymorphismus, weil alle Klassen, die von Test ableiten, selber auch vom Typ "Test" sind. Sie sind eifach spezialisierte Typen von test.
Das nennt man schlicht Vererbung. Nur weil Klasse B von A erbt handelt es sich noch lange nicht um Polymorphismus.
icarus2 schrieb:
Das mit den virtual Funktionen nennt man Late Binding oder auch Dynamic Binding.
Und genau das ist Polymorphismus

-
so etwa:
class Rectangle { public: void draw(); }; class Circle { public: void draw(); }; template<class Shape> void foo(Shape& p) { p.draw(); }(Quelle: Shade of Mine)
Mein Glückskeks sagt: "Seien Sie vorsichtig mit langen Diskussionen".
-
davie schrieb:
...
Das hat nichts mit Polymotphismus zu tun! Wenn, dann so:
struct Shape { void Draw() = 0; }; struct Rect : Shape { void Draw(){/*Implementieren*/}; }; struct Circle : Shape { void Draw(){/*Implementieren*/}; }; void Draw(Shape* Obj) { Obj->Draw(); }
-
EOutOfResources schrieb:
davie schrieb:
...
Das hat nichts mit Polymotphismus zu tun! Wenn, dann so:
Doch hat es, es gibt nämlich unterschiedliche Ebenen des Polymorphismus. Einmal zur Laufzeit in Form von Ableitung und virtuellen Methoden wie in deinem Beispiel, aber auch zur Compilezeit mittels Templates und ÜBerladungen.
-
CStoll schrieb:
aber auch zur Compilezeit mittels Templates und Überladungen.
Achso...
Wusste ich nicht, danke!