This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
in204:tds:sujets:td2:part4 [2019/09/23 17:16] bmonsuez |
in204:tds:sujets:td2:part4 [2022/11/18 10:49] (current) |
||
---|---|---|---|
Line 9: | Line 9: | ||
<code> | <code> | ||
increment() | increment() | ||
- | si counter <= max | + | si counter < max |
counter <- counter + 1 | counter <- counter + 1 | ||
sinon | sinon | ||
Line 16: | Line 16: | ||
Ie. le compteur ne revient pas à zéro et reste à ''max'' une fois la valeur ''max'' atteinte. | Ie. le compteur ne revient pas à zéro et reste à ''max'' une fois la valeur ''max'' atteinte. | ||
+ | |||
+ | <hidden Correction> | ||
+ | |||
+ | Il suffit de définir une classe similaire à la classe suivante : | ||
+ | |||
+ | <code cpp> | ||
+ | class MyAdvCounter: public MyCounter | ||
+ | { | ||
+ | public: | ||
+ | MyAdvCounter(): MyCounter() {} | ||
+ | explicit MyAdvCounter(unsigned theMax): | ||
+ | MyCounter(theMax) | ||
+ | {} | ||
+ | MyAdvCounter(unsigned theCounter, | ||
+ | unsigned theMax): MyCounter(theCounter, theMax) | ||
+ | {} | ||
+ | MyAdvCounter(const MyBiDiCounter& anotherCounter): | ||
+ | MyCounter(anotherCounter.counter) | ||
+ | {} | ||
+ | |||
+ | void increment() | ||
+ | { | ||
+ | if(counter < max) | ||
+ | counter ++; | ||
+ | } | ||
+ | void print() const | ||
+ | { | ||
+ | std::cout << "Compteur: " << counter << "/" << max << std::endl; | ||
+ | } | ||
+ | }; | ||
+ | </code> | ||
+ | |||
+ | La méthode ''increment'' va masquer la classe ''MyCounter::increment'' dans la classe ''MyAdvCounter''. Cependant, la méthode ''increment'' reste présente, elle n'est pas remplacée, elle est simplement 'cachée' ou 'masquée'. Il sera toujours possible de l'appeller en préfixant le nom de la fonction ''increment()'' par ''MyCounter::increment()''. | ||
+ | |||
+ | </hidden> | ||
==== Question n°2 === | ==== Question n°2 === | ||
Line 34: | Line 69: | ||
} | } | ||
</code> | </code> | ||
+ | |||
+ | <hidden Correction> | ||
+ | |||
+ | Le compteur une fois la valeur ''4'' atteinte reste à la valeur ''4''. | ||
+ | |||
+ | </hidden> | ||
==== Question n°3 ==== | ==== Question n°3 ==== | ||
Line 52: | Line 93: | ||
Tester la méthode en passant à la fonction ''testCounter'' un compteur de type ''MyCounter'' et un compteur de type ''MyAdvCounter''. Expliquer le comportement de la fonction pour chacun des types de compteur. | Tester la méthode en passant à la fonction ''testCounter'' un compteur de type ''MyCounter'' et un compteur de type ''MyAdvCounter''. Expliquer le comportement de la fonction pour chacun des types de compteur. | ||
+ | |||
+ | <hidden Correction> | ||
+ | |||
+ | |||
+ | En fait, c'est la méthode ''MyCounter::increment'' qui est appelé et non pas la méthode ''MyAdvCounter::increment''. Pourquoi donc ? | ||
+ | |||
+ | En fait, nous avons transformé un objet de type ''MyAdvCounter'' en objet ''MyCounter''. De ce fait, ce sont les méthodes visibles et accessibles par ''MyCounter'' qui sont appellées. En effet, les méthodes définies dans l'objet ''MyAdvCounter'' ne sont pas visibles et accessibles dans ''MyCounter'', elles sont situés en dehors de la définition de l'objet. Donc même si l'objet auquel je fais référence est un objet qui contient des extensions à l'objet de type ''MyCounter'', il n'est pas possible d'y accéder parce que mon horizon se limite uniquement aux définitions de ''MyCounter''. | ||
+ | |||
+ | Ce comportement n'est pas sastisfaisant et nous souhaitons souvent de pouvoir remplacer la méthode définie dans la classe ''MyCounter::increment'' par une nouvelle méthode qui prendrait la place de la méthode ''MyCounter::increment''. Nous verrons cela au moment où nous nous intéresserons au polymorphisme. | ||
+ | |||
+ | </hidden> | ||