/* IFT1169 - démonstration #02 - exercice 01 30-janvier -2006 v1.00 M.Lokbani - màj pour IFT1169 + gcc3.4.2 exemple pris de H. Garreta contact: lokbani@iro.umontreal.ca Copyright (C) 1999-2006 Université de Montréal Département d'informatique et de Recherche Opérationnelle Mohamed Lokbani -- Tous Droits Réservés -- All Rights Reserved -- Description: ------------ Pour les déclarations ci-dessus dites si elles sont correctes ou incorrectes et dans les deux cas justifier votre réponse. */ #include using namespace std; class Animal { public: virtual void uneFonction() { // il faut au moins une fonction virtuelle // (car il faut des classes polymorphes) } }; class Mammifere : public Animal { }; class Chien : public Mammifere { }; class Caniche : public Chien { }; class Chat : public Mammifere { }; class Reverbere { }; int main(){ Chien medor; Animal *ptr = &medor; Mammifere *p0 = ptr; // correcte ou incorrecte? // incorrecte: erreur à la compilation. Un animal n'est pas forcément un Mammifère. Mammifere *p1 = dynamic_cast(ptr); // correcte ou incorrecte? // correcte. p1 reçoit l'adresse d'un Médor et comme un Médor est un mammifère donc ok. Caniche *p2 = dynamic_cast(ptr); // correcte ou incorrecte? // correcte. Hic: p2 reçoit un pointeur nul (0), car Médor n'est pas un caniche Chat *p3 = dynamic_cast(ptr); // correcte ou incorrecte? // correcte. Hic: p3 reçoit la aussi un pointeur nul (0), car Médor n'est pas un chat Reverbere *p4 = dynamic_cast(ptr); // correcte ou incorrecte? // correcte. Hic: p4 reçoit la aussi un pointeur nul (0), car Médor n'est pas un reverbère /* L'opérateur dynamic_cast s'applique également aux références. L'explication est la même, sauf qu'en cas d'impossibilité d'effectuer la conversion, cet opérateur lance l'exception bad cast. */ Animal &ref = medor; Mammifere &r1 = dynamic_cast(ref); // correcte ou incorrecte? // Ok correcte. Caniche &r2 = dynamic_cast(ref); // // correcte ou incorrecte? // Incorrecte. Conversion impossible => exception est lancée. return 0; }