====== Partie II – Destructeurs ======
Nous créons les classes suivantes :
class GraphicalObject
{
public:
virtual void draw () const = 0 ;
~GraphicalObject() { std::cout << "& Delete GraphicalObject \n"; }
};
class Line: public GraphicalObject
{
public:
virtual void draw () const { std::cout << "Line"; } ;
~Line() { std::cout << "Delete Line\n"; }
};
class Circle: public GraphicalObject
{
public:
virtual void draw() const { std::cout << " Circle"; } ;
~Circle () { std::cout << "Delete Circle \n"; }
};
Nous créons le tableau d’objet suivant :
std::vector createGraphicalObjects(
int theSize)
{
std::vector graphicalObjects(theSize);
for(int i=0; i < size; i++)
{
graphicalObjects[i] = new Line();
graphicalObjects[++i] = new Circle();
}
return graphicalObjects;
}
Nous définissons une fonction de dessin pour l'ensemble des éléments
dans le tableau.
void drawGraphicalObjects(std::vector& theGraphicalObjects)
{
for(auto it = theGraphicalObjects.begin();
it < theGraphicalObjects.end(); it++)
{
(*it)->draw();
}
}
Nous créons la fonction de destruction du tableau suivante:
void deleteGraphicalObjects(std::vector& theGraphicalObjects)
{
for(auto it = theGraphicalObjects.begin();
it < theGraphicalObjects.end(); it++)
{
delete *it;
}
}
Et nous testons avec le code suivant :
auto graphicalObjects = createGraphicalObjects(10);
drawGraphicalObjects(graphicalObjects);
deleteGraphicalObjects(graphicalObjects);
===== Question n°1 =====
Justifier la sortie produite à l’écran ? Est-ce que c’est le comportement désiré ?
Le destructeur appellé est celui de l'objet de base. Nous souhaitons appeller le destructeur de l'objet véritablement détruit et non celui de l'objet de base.
===== Question n°2 =====
Proposer une modification pour obtenir le comportement souhaité.
Tester après cette modification.
Nous déclarons le destructeur dans la classe de base comme étant virtuel.
class GraphicalObject
{
public:
virtual void draw () const = 0 ;
~GraphicalObject() { std::cout << "& Delete GraphicalObject \n"; }
};
class Line: public GraphicalObject
{
public:
virtual void draw () const { std::cout << "Line"; } ;
~Line() { std::cout << "Delete Line\n"; }
};
class Circle: public GraphicalObject
{
public:
virtual void draw() const { std::cout << " Circle"; } ;
~Circle () { std::cout << "Delete Circle \n"; }
};
Désormais, c'est bien le destructeur de l'objet qui est détruit qui est appellé et pas uniquement le destructeur de la classe de base.