Exercice 116
Énoncé
Quels résultats produira ce programme :
#include
using namespace std ;
class point
{ int x, y ;
public :
point (int abs=0, int ord=0) { x=abs ; y=ord ; }
virtual void identifie ()
{ cout << "Je suis un point \n" ;
}
void affiche ()
{ identifie () ;
cout << "Mes coordonnées sont : " << x << " " << y << "\n" ;
}
} ;
class pointcol : public point
{ short couleur ;
public :
pointcol (int abs=0, int ord=0, int cl=1 ) : point (abs, ord)
{ couleur = cl ; }
void identifie ()
{ cout << "Je suis un point coloré de couleur : " << couleur << "\n" ;
}
} ;
main()
{ point p(3,4) ;
pointcol pc(5,9,5) ;
p.affiche () ;
pc.affiche () ;
cout << "---------------\n" ;
point * adp = &p ;
pointcol * adpc = &pc ;
adp->affiche () ; adpc->affiche () ;
cout << "---------------\n" ;
adp = adpc ;
adp->affiche () ; adpc->affiche () ;
}
Dans la fonction affiche de point, l’appel de identifie fait l’objet d’une ligature
dynamique (puisque cette dernière fonction a été déclarée virtuelle). Lorsqu’un objet
de type pointcol appelle une fonction affiche, ce sera bien la fonction affiche de point qui
sera appelée (puisque affiche n’est pas redéfinie dans pointcol). Mais cette dernière fera
appel, dans ce cas, à la fonction identifie de pointcol. Bien entendu, lorsqu’un objet de
type point appelle affiche, cette dernière fera toujours appel à la fonction identifie de
point (le même résultat serait obtenu sans ligature dynamique).
278
Précédent

- 279/398

Suivant