Pointer auf abgeleitete Klassen
-
Hallo zusammen,
ich hoffe meine Frage ist nicht allzu unqualifiziert. Ich habe folgendes prinzipielles Problem:
BasisKlasse{
//hier gibts einige Methoden und Konstruktoren
};AbgeleiteteKlasse : public BasisKlasse{
Typ eineMethode();
};Irgendwo im Code möchte ich von "AbgeleiteteKlasse" Gebrauch machen. Also:
BasisKlasse *b = new AbgeleiteteKlasse();Nun möchte ich *b natürlich als "BasisKlasse" verwenden, und bei bedarf auf die zusätzliche Funktionalität in "AbgeleiteteKlasse" verfügen, z.B.:
b->eineMethode();Wieso funktioniert sowas nicht?
-
Polymorphie hilft dir bei "Rufe die richtige Methode auf", nicht bei "Rufe eine Methode die nur in der abgeleiteten Klasse existiert auf"!
class Base { virtual void foo (); }; class Derived1 : public Base { virtual void foo () { cout << "Derived1" << endl; } }; class Derived2 : public Base { virtual void foo () { cout << "Derived2" << endl; } }; ... Base* base = new Derived1(); base->foo(); // Derived1::foo()Aber die Methode muss zumindest im abstrakten Zustand schon in der Basisklasse vorhanden sein.
MfG SideWinder
-
Danke für die schnelle Antwort! Wenn ich die Methode als "virtual" in der BasisKlasse vordeklariere, dann klappt's
Ist dies die einzige Möglichkeit? Die Basisklasse könnte ja schon "fertig" sein, und man möchte nur noch zusätzlich was hinzufügen, ohne die Basisklasse zu verändern.MfG
-
Du kannst natürlich auch etwas in der abgeleiteten Klasse hinzufügen (meistens der Sinn von abgeleiteten Klassen). Diese zusätzliche Funktionalität ist dann aber nicht über einen Basisklassen-Zeiger aufrufbar (woher soll der auch davon wissen).
Bist du dir also sicher ein Derived1-Objekt zu besitzen kannst du einen Cast durchführen (Stichwort: dynamic_cast) und den Basisklassen-Zeiger auf einen Derived1-Zeiger casten. Dann sind abgeleitete Funktionen ebenfalls aufrufbar. Natürlich hat das dann nichts mehr mit Polymorphie zu tun.
MfG SideWinder
-
Ich habe mir mal dynamic_cast angeschaut und damit klappt's wunderbar!
Danke!
MfG