10.5 Example avec héritqge


#include <iostream>
using namespace std;
// classe Point
#include "point.h"
// produit vectoriel
double prodvect(double x1,double y1,double x2,double y2)
{ return x1*y2-x2*y1; }
// classe element générique
class Polygone {
protected:
   int np;      // nbre de points
   Point *pt;   // liste des points
public:
   Polygone(int n) { np=n; pt=new Point[n];  };
   ~Polygone() { delete pt; };
   // fonctions devant etre redefinie
   virtual double surface() { return 0;};
   virtual char * type()    { return "inconnue:"; };
// methode amie
   friend ostream& operator<<(ostream &s,const Polygone P);
};
// fonction amie permettant l'acces aux donnees
ostream& operator<<(ostream &s,const Polygone P)
{ s<<"["; 
  for (int i=0; i<P.np; i++) s<<P.pt[i];
  s<<"]"; return s;
}
// classe derivee triangle
class Triangle:public Polygone {
public:
   Triangle(Point P0,Point P1,Point P2):Polygone(3) 
     { pt[0]=P0; pt[1]=P1; pt[2]=P2;};
   //
   char * type() { return "Triangle: "; };
   double surface() 
    { return 0.5*prodvect(pt[1].X()-pt[0].X(),pt[1].Y()-pt[0].Y(),
                          pt[2].X()-pt[0].X(),pt[2].Y()-pt[0].Y());};
};
// et quadrangle regulier
class Quadrangle:public Polygone {
public:
   Quadrangle(Point P0,Point P1,Point P2,Point P3):Polygone(4) 
     { pt[0]=P0; pt[1]=P1; pt[2]=P2; pt[3]=P3;};
   //
   char * type() { return "Quadrangle: "; };
   double surface() 
    { return 0.5*prodvect(pt[1].X()-pt[0].X(),pt[1].Y()-pt[0].Y(),
                          pt[2].X()-pt[0].X(),pt[2].Y()-pt[0].Y())+
	     0.5*prodvect(pt[1].X()-pt[2].X(),pt[1].Y()-pt[2].Y(),
                          pt[3].X()-pt[2].X(),pt[3].Y()-pt[2].Y());};
};
// fonction generique: affichage des elts d'un maillage
void info(Polygone* M[],const int n)
{
   for(int i=0; i<n; i++) {
     cout<<M[i]->type()<<*M[i]<<endl;
     cout<<"surface="<<M[i]->surface()<<endl;
   }
}
//
int main()
{
   Point P0(0,0),P1(1,0),P2(0,1),P3(1,1);
   Triangle T1(P0,P1,P3),T2(P0,P3,P2);
   Quadrangle Q(P0,P1,P2,P3);
   // maillage =liste d'elements
   const int ne=3;
   Polygone * Mesh[ne]={&T1,&T2,&Q};
   //
   info(Mesh,ne);
   return 0;
}


#include <iostream>
using namespace std;
// classe de Point
class Point {
// donnees privees
private:
  double x,y;
// methodes public
public:
  // constructeur
  Point(double a=0,double b=0) { x=a; y=b;};
  Point(const Point &P) { x=P.x; y=P.y; };
  // acces aux donnees (en lecture uniquement)
  double X() { return x; }
  double Y() { return y; }
  // position
  void position(double a,double b) 
    { x=a; y=b;};
  // surcharge d'operateur: P=P1+P2
  Point operator+(const Point P) const
    { return Point(x+P.x,y+P.y); };
  // P=P1*a
  Point operator*(double a) const
    { return Point(x*a,y*a); }; 
  // affichage
  friend ostream& operator<<(ostream &s,const Point P); 
};
// fonction amie permettant l'acces aux donnees
ostream& operator<<(ostream &s,const Point P)
    { return s<<"("<<P.x<<","<<P.y<<")"; };
//




Pr. Marc BUFFAT
buffat@ufrmeca.univ-lyon1.fr
2004-12-01