/* Fichier Heritage.cpp Héritage simple Rectangle / \ / \ Rectangle Visible Carre champ suppl. Pas de champ supplé. etc etc ... */ #include #include #include #include using namespace std; // ---- classe Rectangle --------- class Rectangle { protected : // accesible AUSSI dans ses classes dérivées double longueur, largeur; public : Rectangle( double = 8.6, double = 5.4); Rectangle(const Rectangle&); // constructeur de recopie double perimetre() const ; double surface() const; void afficher(string = ""); }; // initialiser le champ longueur par le paramètre longueur Rectangle::Rectangle( double longueur, double largeur): longueur(longueur) { this->largeur = largeur; } Rectangle::Rectangle(const Rectangle& autre){ this->longueur = autre.longueur; this->largeur = autre.largeur; } void Rectangle::afficher(string message) { cout << "\n $$$$ Appel afficher de Rectangle $$$\n"; cout << "Infos " << message << ": " << longueur << "\t" << largeur << "\t" << perimetre() << "\t" << surface() << endl; } double Rectangle::surface() const { return longueur * largeur; } double Rectangle::perimetre() const { return 2 * (longueur + largeur) ; } // ---- classe RectangleVisible, dérivée de Rectangle --------- class RectangleVisible : public Rectangle { private: bool estVisible ; // champ supplémentaire public: RectangleVisible(double,double, bool); void afficher(string = ""); }; RectangleVisible::RectangleVisible( double longueur,double largeur, bool estVisible) : Rectangle(longueur,largeur) // appel le constructeur de Rectangle { this->estVisible = estVisible; } void RectangleVisible::afficher(string message) { cout << "\n !!!! Appel afficher de RectangleVisible !!!!\n"; cout << "Infos " << message << " (en tant que Rectangle) : " ; Rectangle::afficher(); // appel la méthode afficher de Rectangle cout << "est-il visible ? : - " << (estVisible? "Oui":"Non") << endl ; } // ---- classe Carre dérivée de Rectangle --------- class Carre : public Rectangle { public : Carre(double cote); double diagonale() const; // méthode supplémentaire void afficher(string = ""); }; // construire un carré comme un rectangle dont // longueur est le côté, largeur est le côté Carre::Carre(double cote) : Rectangle(cote, cote) { } double Carre::diagonale() const { return longueur * sqrt(2.0); } void Carre::afficher(string message) { cout << "\n ??? Appel afficher de Carre ???\n"; cout << "Infos " << message << " (en tant que Rectangle) : " ; Rectangle::afficher(); cout << "diagonale : " << diagonale() << endl ; } void demoRectangle() { cout << " *** Demo de la classe Rectangle ***\n"; Rectangle rect1(6.2, 5.9); rect1.afficher("de rect1"); Rectangle rect2 = rect1; rect2.afficher("de rect2 qui est une copie de rect1"); Rectangle rect3(rect1); rect3.afficher("de rect3 (une autre copie de rect1"); Rectangle rect4; rect4.afficher("de rect4, au debut (valeurs par defaut"); Rectangle * p = &rect1; p->afficher("du rectangle pointe par p"); cout << "\n *** Fin de la demo de la classe Rectangle ***\n\n"; } void demoRectangleVisible() { cout << " --> Demo de la classe RectangleVisible <---\n"; RectangleVisible rv1(10.8, 6.4, true); rv1.afficher("de rv1"); Rectangle* p = &rv1; cout << "\nPas de probleme a la compilation :\n"; p->afficher("du rectangle visible pointe par p"); cout << "\n --> Fin de la demo de la classe RectangleVisible <--\n\n"; } void demoCarre() { cout << " **> Demo de la classe Carre <**\n\n"; Carre c(4.5); c.afficher("du carre c"); Rectangle* p = &c; cout << "\nPas de probleme a la compilation :\n"; p->afficher("du carre pointe par p (voir Virtuel.cpp)"); cout << "\n --> Fin de la demo de la classe Carre <--\n\n"; } void continuer() { cout << endl << endl << "Appuyez sur une lettre suivie de Entree " ; char lettre; cin >> lettre ; cout << endl << endl; } int main() { demoRectangle(); demoRectangleVisible(); demoCarre(); continuer(); return 0; } /* Exécution: *** Demo de la classe Rectangle *** *** Demo de la classe Rectangle *** $$$$ Appel afficher de Rectangle $$$ Infos de rect1: 6.2 5.9 24.2 36.58 $$$$ Appel afficher de Rectangle $$$ Infos de rect2 qui est une copie de rect1: 6.2 5.9 24.2 36.58 $$$$ Appel afficher de Rectangle $$$ Infos de rect3 (une autre copie de rect1: 6.2 5.9 24.2 36.58 $$$$ Appel afficher de Rectangle $$$ Infos de rect4, au debut (valeurs par defaut: 8.6 5.4 28 46.44 $$$$ Appel afficher de Rectangle $$$ Infos du rectangle pointe par p: 6.2 5.9 24.2 36.58 *** Fin de la demo de la classe Rectangle *** --> Demo de la classe RectangleVisible <--- !!!! Appel afficher de RectangleVisible !!!! Infos de rv1 (en tant que Rectangle) : $$$$ Appel afficher de Rectangle $$$ Infos : 10.8 6.4 34.4 69.12 est-il visible ? : - Oui Pas de probleme a la compilation : $$$$ Appel afficher de Rectangle $$$ Infos du rectangle visible pointe par p: 10.8 6.4 34.4 69.12 --> Fin de la demo de la classe RectangleVisible <-- **> Demo de la classe Carre <** ??? Appel afficher de Carre ??? Infos du carre c (en tant que Rectangle) : $$$$ Appel afficher de Rectangle $$$ Infos : 4.5 4.5 18 20.25 diagonale : 6.36396 Pas de probleme a la compilation : $$$$ Appel afficher de Rectangle $$$ Infos du carre pointe par p (voir Virtuel.cpp): 4.5 4.5 18 20.25 --> Fin de la demo de la classe Carre <-- Appuyez sur une lettre suivie de Entree */