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.
    Bei

    dynamic_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 Zuweisung

    p = 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.


Anmelden zum Antworten