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 122 123 124 125 126 127
| #include <iostream>
#include <list>
enum eType
{
tIsA,
tIsB
};
class A
{
public:
A():m_type(tIsA){}
virtual ~A(){}
bool isAnA()const {return m_type==tIsA;}
bool isA_B()const {return m_type==tIsB;}
eType getType() const{return m_type;}
void print(){std::cout<<"je suis un A";}
protected:
A(eType t):m_type(t){}
private:
eType m_type;
};
class B: public A
{
public:
B():A(tIsB){}
virtual ~B(){}
void identify(){std::cout<<"Je suis un B";}
protected:
private:
};
class C
{
public:
C(): m_items(){}
~C()
{
for(std::list<A*>::iterator it=m_items.begin();
it!=m_items.end();++it)
delete (*it);
}
void createA(){m_items.push_back(new A());}
void createB(){ m_items.push_back(new B());}
size_t size() const{return m_items.size();}
A* getA(size_t ind)
{
std::list<A*>::iterator it=m_items.begin();
for(size_t i=0;i<ind;++i)
{
++it;
}
return (*it);
}
B* getB(size_t ind)
{
std::list<A*>::iterator it=m_items.begin();
for(size_t i=0;i<ind;++i)
{
++it;
}
return static_cast<B*>(*it);
}
eType getTypeOfElement(size_t ind)
{
std::list<A*>::iterator it=m_items.begin();
for(size_t i=0;i<ind;++i)
{
++it;
}
return (*it)->getType();
}
void identifyAll()
{
size_t num=1;
for(std::list<A*>::const_iterator it=m_items.begin(); it!= m_items.end();
++it)
{
std::cout<<"Element "<<num<<" dit ";
if( (*it)->isAnA())
{
A* elem= (*it);
elem->print();
}
else
{
B* elem=static_cast<B*> (*it);
elem->identify();
}
std::cout<<std::endl;
++num;
}
}
protected:
private:
std::list<A*> m_items;
};
int main()
{
C c;
c.createA();
c.createB();
c.createA();
c.createB();
std::cout<<"nombre d'éléments" <<c.size()<<std::endl;
std::cout<<"Appel de l'identification de tous les éléments contenus dans c"
<<std::endl;
c.identifyAll();
std::cout<<"voyons ce qui se passe avec les méthodes fournies par la classe"
<<" C"<<std::endl;
for(size_t i=0;i<c.size();++i)
{
std::cout<<"l'element "<<i<<" est du type ";
switch(c.getTypeOfElement(i))
{
case tIsA:
std::cout<<"A et utilise la methode print :";
c.getA(i)->print();
break;
case tIsB:
std::cout<<"B et utilise la méthode identify :";
c.getB(i)->identify();
}
std::cout<<std::endl;
}
return 0;
} |