polymorphismus
-
CarstenJ schrieb:
Da FileTree von IObject erbt, hat es die gleichen Schnittstellen wie IObject, welche eben nur anders implementiert werden.
implementiert werden koennen / oft auch nicht anders implementiert werden koennen.
auszerdem kann die schnittstelle der basisklasse um eigene funktionen erweitert werden.
wenn du von einer klasseclass base { public: virtual void foo() { cout << "base::foo"; } };
erbst, dann hat jede abgeleitete klasse eine funktion namens foo, deren implementierung bei bedarf geaendert werden kann (in den abgeleiteten klassen).
zbclass derived: public base { public: void foo () { cout << "derived::foo"; } };
die abgeleitete klasse darf jedoch auch ihre eigene, spezialisiertere schnittstelle anbieten:
class derived2 : public base { public: void foo () { cout << "derived2::foo"; } void bar () { cout << "derived2::bar"; } };
jetzt schau dir in ruhe folgenden code an:
derived2 *d = new derived2; d->foo(); d->bar(); //alles ok bis jetzt. base *b = d; //so //b ist ein zeiger auf base. d ist vom typ derived2. und //weil derived2 von base erbt, ist derived2 ein base. //deshalb ist ein zeiger auf ein derived2 (d) auch an einen //zeiger auf ein base zuweisbar //achtung: fuer den compiler zeigt b auf ein base (so ist b ja auch //deklariert worden) //das heiszt: ueber b kann ich nicht die funktionen aufrufen, die derived2 anbietet //wohl aber die gemeinsame funktion foo b->foo(); //was zur ausgabe "derived2::foo" fuehrt.
-
implementiert werden koennen / oft auch nicht anders implementiert werden koennen
Ich meinte damit, da es eine abstrakte Klasse ist, MÜSSEN die erbenden Klassen das implementieren, sonst wären sie ja auch abstrakt...
Wie auch immer, jetzt ist soweit alles klar. Danke