Ciao a tutti,
ho un problema, sostanzialmente logico.
Ho implementato una semplice classe Bin_tree e ora mi ritrovo a dover crearne una nuova ( Redblack_tree ) utilizzando Bin_tree come base.
Questa e' la classe base:

codice:
template<class T1> class Bin_tree {
public:
	enum { NOT_FOUND = -10, ALREADY_EXIST = -9 };
	Bin_tree() : empty(true) {}
	virtual int store(const T1&);
	int search(const T1&);
	T1* get_ptr(int);
	virtual void remove(int);
	void destroy();
	virtual void print();
	bool is_empty() { return empty; }
	virtual ~Bin_tree() {}
protected:
	Tnode<T1>* get_node(int index) { return nodes[index]; }
	bool is_error_code(int index) { return index < 0 ? true : false; }
	virtual Tnode<T1>* make_node() { return new Tnode<T1>; }
private:
	/* ... */
	bool empty;
	std::vector<Tnode<T1>*> nodes;		// required for indexing.
};
Come si puo' immaginare la classe si basa sull' utilizzo di oggetti Tnode<>* (nodi dell' albero).
Questa sarebbe invece la classe derivata:

codice:
template<class T1> class Redblack_tree : public Bin_tree<T1> {
public:
	Redblack_tree() : Bin_tree<T1>() {}
	virtual int store(const T1&);
	virtual void remove(int);
	virtual void print();
protected: // Rbtnode<> e' derivato pubblicamente da Tnode<> .
	virtual Tnode<T1>* make_node() { return new Rbtnode<T1>; }
};
I Tnode<>* sono dei puntatori a nodi progettati per il classico albero binario, nel momento in cui un utente deve implementare qualcosa come un Redblack_tree, questo dovra' anche preoccuparsi di fornire un nodo adeguato ( di tipo derivato da Tnode<> ), come Rbtndoe<>, che aggiunge la nozione di colore ( quindi solamente un mebro di tipo int in piu' ).

Se un membro di una classe derivata vuole un puntatore ad un nodo, questa deve chiamare il membro della classe base get_ptr(), che pero' restituisce un Tnode<>* generico; quindi se per esempio un metodo di Redblack_tree dovesse accedere alla nozione di colore di un Tnode<>*, questa dovrebbe castare il puntatore attraverso un dynamic_cast<Rbtnode<T>* >(some_tnode), per esempio :

codice:
template<class T1> int Redblack_tree<T1>::store(const T1& obj)
{
	bool is_root = this->is_empty();
	int obj_index = Bin_tree<T1>::store(obj);
	if ( is_root )
		dynamic_cast<Rbtnode<T1>* >(this->get_node(obj_index))->color = Rbtnode<T1>::black;
	/* ... */
}
Come posso evitare il dynamic_cast<> ?