Down-Cast sinnvoll?
-
Hallo,
ich habe folgendes Problem: in einer Basisklasse B wird eine Referenz auf eine andere Basisklasse C festgelegt. Später will dann die abgeleitete Klasse von B auf eine Methode der abgeleiteten Klasse von C zugreifen, was nicht geht.
Kompilerfehler: 'methoden_name' undeclared (first use this function)
Hier mal der Code:
template <typename T> class C {...}; class C_ab : public C<spezielles_template> { public: C_ab(); void methoden_name(); }; template <typename T> class B{ public: B(){p = NULL;} protected: C<T>* p; }; class B_ab : public B<spezielles_template>{ public: B_ab(){p = new C_ab;} void m(){p->methoden_name();} };Der Zeiger p muß schon in der Klasse B definiert werden, weil dort schon Funktionen auf ihn zugreifen (allerdings erst zur Laufzeit, wenn B_ab instanziert wurde). Das Programm ist so aufgebaut, dass die beide Klassen B_ab und C_ab vor dem Kompilieren durch andere ersetzt werden können.
Meine Frage(n):
1. Ist hier ein Down-Cast Sinnvoll, oder gibt es eine elegantere Möglichkeit?
2. Wie implementiere ich diesen (müßte ja in der Klassendeklarartion von B_ab stehen)
-
@1: Da bin ich momentan überfragt. Aber wenn du dir GANZ sicher bist, daß dort ein C_ab* dahintersteht, fällt mir nichts besseres ein.
@2: per dynamic_cast kannst du deinen Pointer passend umwandeln (das liefert NULL zurück, wenn du doch keinen C_ab dort stehen hast).
(wenn du sicher bist, ohne Fehlerbehandlung auszukommen, kannst du auch static_cast verwenden - aber damit erhältst du womöglich undefiniertes Verhalten)
-
static_cast<C_ab*>(p)->methoden_name();Funktioniert.
Beidynamic_cast<C_ab*>(p)->methoden_name();bekomme ich folgende Fehlermeldung:
cannot dynamic_cast
this->B::p' (of type \class C*') to type `class C_ab*' (source type is not polymorphic)das verstehe ich nicht, uch führe doch den selben cast durch.
Ist nicht eigentlich die Zuweisungp = new C_ab;schon kritisch, weil einem Zeiger auf C eine Instanz von C_ab zugewiesen wird?
Wäre es unter Umständen nicht sinnvoller eine Factory zu bauen, die einen Zeiger der richtigen Ausprägung liefert?
-
Die Fehlermeldung sagt doch alles. Deine Basisklasse ist nicht polymorph, d.h. sie enthält keine virtuellen Funktionen.