1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
|
#include <iostream>
#include <vector>
#include <list>
using namespace std;
class Point
{
public:
friend std::ostream& operator << (std::ostream& O, const Point& x);
virtual Point & operator +=( Point& x)=0;
virtual Point & operator -=( Point& x)=0;
virtual void Print( Point& B)=0 ;
};
std::ostream& operator << (std::ostream& O, Point& B)
{
B.Print(B);
return O;
}
Point & operator+(Point& x1, Point& x2)
{
Point & x= x1;
return x+=x2;
}
Point & operator-(Point& x1, Point& x2)
{
Point & x= x1;
return x-=x2;
}
template< class T > class Target
{
public :
virtual T & add( T& x) = 0 ;
virtual T & sub( T& x) = 0 ;
virtual void f_Print(T& x)=0;
} ;
template< class T > class F : virtual public Point
{
public :
virtual Point & operator +=( Point& x)
{
typedef Target< T > TargetT ;
return dynamic_cast< TargetT& >(x).add( static_cast< T& >(*this) ) ;
}
virtual Point & operator -=( Point& x)
{
typedef Target< T > TargetT ;
return dynamic_cast< TargetT& >(x).sub( static_cast< T& >(*this) ) ;
}
virtual void Print( Point& x)
{
typedef Target< T > TargetT ;
return dynamic_cast< TargetT& >(x).f_Print( static_cast< T& >(*this) ) ;
}
};
class Point1d : public F< Point1d >,
public Target< Point1d >
{
public :
int i;
Point1d()
{i=0;}
Point1d(int j){i=j;}
Point1d & add( Point1d& x){this->i+=x.i;}
Point1d & sub( Point1d& x){this->i-=x.i;}
virtual void f_Print(Point1d& x)
{
cout << i<< endl;
}
} ;
class Point2d : public F< Point2d >,
public Target< Point2d >
{
public :
int i[2];
Point2d()
{i[0]=0;i[1]=0;}
Point2d(int i0,int i1){i[0]=i0;i[1]=i1;}
Point2d & add( Point2d& x){this->i[0]+=x.i[0];this->i[1]+=x.i[1];}
Point2d & sub( Point2d& x){this->i[0]-=x.i[0];this->i[1]-=x.i[1];}
virtual void f_Print( Point2d& x)
{
cout << i[0]<< " " << i[1]<< endl;
}
};
int main()
{
Point1d a(1), c(2) ;
Point2d b(1,2) ;
Point*ptr;
ptr = &a;
*ptr = c - *ptr;
cout << *ptr;
ptr =&b;
*ptr+=*ptr;
cout << *ptr;
} |
Partager