Kann ein Parent wissen, von welchem Child er aktuell benutzt wird?
-
Ich habe hier ein rein logisches Problem, habe aber zuwenig Erfahrung mit Objekt-Orientierung. Und zwar habe ich 3 Klassen:
Klasse A: Instanziiert Klasse B
Klasse B: Stammt von Klasse C ab
Klasse C: Eine Klasse mit vielen StandardmethodenDie Klasse B stammt also von C ab, weil sie neben den C-typischen Methoden auch spezielle eigene Methoden besitzt. Jetzt habe ich das Problem, dass Klasse C eine Methode XYZ verwendet, die Klasse B besitzt, weil sie von mal zu mal unterschiedlich ist. So würde eine Klasse D, die auch von C abstammt, eine noch andere Version dieser Methode XYZ haben.
Wie bringe ich C nun bei, dass es die Methode XYZ von z.B. B benutzen soll und ein anderes mal von D? Gibt es sowas (nur hypothetisch) wie child->XYZ() ?
-
- streichen -
-
Klasse C weiss aber nicht, ob es B::XYZ oder D:XYZ aufrufen soll. Es muss wissen, wer sein aktueller Child ist.
-
siehe virtual.
http://www.henkessoft.de/C++/Cpp_school/virtual.html
-
Also, so wie ich das verstanden habe, dürfte das - als Code - bei dir so aussehen:
#include <iostream> // ## Basisklasse C ############################################################ class C { public: void verwendeMethode() { /* B::XYZ() oder D::XYZ? */ } private: }; // ## Abgeleitete Klassen B und D ############################################## class B : public C { public: void XYZ() { std::cout << "Klasse B\n"; } private: }; class D : public C { public: void XYZ() { std::cout << "Klasse D\n"; } private: }; // ## unwichtig für das Beispiel ############################################### class A { public: B einB; private: }; // ## main: Hauptprogramm ###################################################### int main() { return 0; }Die Lösung ist, wie Erhart Enkes bereits angedeutet hat, folgendes:
#include <iostream> // ## Basisklasse C ############################################################ class C { public: C* child; virtual void XYZ() { std::cout << "Klasse C\n"; } void verwendeMethode() { child->XYZ(); } private: }; // ## Abgeleitete Klassen B und D ############################################## class B : public C { public: void XYZ() { std::cout << "Klasse B\n"; } private: }; class D : public C { public: void XYZ() { std::cout << "Klasse D\n"; } private: }; // ## main: Hauptprogramm ###################################################### int main() { C einC; einC.child = new B; einC.verwendeMethode(); delete einC.child; einC.child = new D; einC.verwendeMethode(); delete einC.child; std::cin.get(); return 0; }Hier kommt die Polymorphie zum Einsatz. Mithilfe von Zeigern und einer virtuellen Tabelle (sog. vtable) kann die Basisklasse zur Laufzeit ermitteln, welche Methode die richtige ist und aufgerufen werden soll.
-
Perfekt, das ist die Lösung, danke
