frage zu vererbungsproblem
-
ich habe da folgendes problem, ein beispiel:
es existiere eine Klasse CX_A.
Von dieser gibt es nun zwei Unterklassen CX_B und CX_C.Nun habe ich eine weitere Klasse CY_Test, dessen Konstruktor
ein CX_A Objekt uebergeben bekommt (siehe oben), d.h. ich kann ihm auch ein
CX_B oder ein CX_C Objekt uebergeben.Mein Problem ist nun folgendes: obiger klassenentwurf ist mir vorgelegt worden(habe ich nicht selber geschrieben). Ich habe lediglich CX_C mit einer weiteren methode bestueckt, die die basisklasse CX_A nicht hat.
an einer bestimmten programmstelle ist mir aufgefallen, dass ich genau diese spezielle methode aufrufen muss, aber CY_Test kennt das Objekt dass ihm im Konstruktor uebergeben wurde nur als CX_A Objekt und folglich meckert mein compiler.
Kann ich hier einfach auf ein CX_C casten oder ist das ein entwurfsfehler oder was!?!?!
Vielen dank.
-
peperony schrieb:
Kann ich hier einfach auf ein CX_C casten oder ist das ein entwurfsfehler oder was!?!?!
Beides ist möglich.
Bye, TGGC (Denken, und gut ist.)
-
da du die Oberklassen nicht verändern kannst (nehm ich mal an), musst dus wohl so machen, oder du schreibst sowas:
class Name { public: Name(A* ptr); name(C* ptr); };
-
Hi,
Du kannst jetzt verschieden vorgehen. Entweder, die Basisklasse deklariert die Methode bereits virtuell, sodass du sie auch von dort aufrufen kannst oder du musst casten. So ein cast kann via dynamic_cast gemacht werden, das ist aber nicht gerade schön.
Überdenke lieber dein Konzept, Glamdrings Möglichkeit ist IMHO auch nicht sonderlich schön.MfG Eisflamme
-
class Name { public: Name(A* ptr); name(C* ptr); };
und was ist, wenn ich C über eine Fabrik erstelle, die nur A* zurückgibt? dann hilft mir der zweite ctor garnicht.
es gibt mehrere ansätze:
1. ein anderes design(beste lösung)
2. dynamic_cast(schlecht)
3. eines der vielen frameworks benutzen, die jeder Klasse einen unique integer wert zuordnen können. nachteil: du musst alle Klassen der vererbungshierarchi inklusive A verändern(viel arbeit, aber lohnt sich manchmal)