Passage le fonction vitrtuel et la vtable , le dynamic binding . .. ca prend plusieur pages pour les explications pas la place ici
alors le upcasting et donw casting ej v te montrer un exemple
classe base
{
public:
virtual void f(){cout<<"fonction de base"<<endl;}
};
classe derivée : public base
{
public :
void f(){cout<<"fonction derivee"<<endl;}
void g(){cout<<"fct add"<<endl;}
};
la relative complexite de l utilisation de ces deux classes redisde dans :
l existence d une methode vitruelle f();
l ajout d´ une methode g() pour la class fille
L emploi de de la methode f() ne pose pas de probleme temps que l on utilise des pointeurs sur des objets instanciant les classes consideres et non pas des objets statiques
donc avec la declaration suivante
base *pb= new derivee; //upcast
D´un point de vue STATIQUE, lobjet désigné par pb est une base; mais d un point de vue DYNAMIQUE cet objet est une derivee,on peut remarquer que l expresssion new derivee renvoi en fait un pointeur sur un objet derivee : il est ensuite casté en un pointeur d´objet base,sans probleme puisque une derivee est une base.. (upcasting)
pb->f();
provoquera bien l appel de la fonction f() version derivée puisqu elle est virtuelle et que cet appel est don resolu a l execution . ( mechanisme vtable... late binding...)
bon le donw casting now
si tu fais
pb->g(); //a marche pas
le compilateur se plaint en effet de ce que g() ne soit pas une methode de la classe base !
Pour parvenir a cette conclusion il a considere qu il pouvait resoudre l´appel a la compilation (g() n est pas une methode virtuelle redefinie): et comme pb pointe en principe une base . ..
ici nous sommes cependant surs que l objet pointé est un objet de la callse dérivée si bien que nous allons forcer le destin par:
((derivee *)pb)->g();//voila le downcasting
on caste donc ici un pointeur de classe en un pointeur de classe derivée c est le doxn casting . le compilateur laissera faire.
grace a l operateur dynamic_cast<classe *>(pointeur) on peut tester la validiter d un downcasting
. ..
la vtable j ai pas le courage de te l epxliquer ce matin : )
LcData
www.ploksoftware.org