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
| class Base{
public:
/* pour respecter la sémantique d'entité */
Base(Base const &) = delete;
Base & operator = (Base const &) = delete;
/* pour pouvoir détruire les instances des classes dérivées quand on ne les connait que
* comme étant du type de base
*/
virtual ~Base();
/* un exemple de fonciton connue */
/* virtual */ void foo();
/* ... */
};
class D1 : public Base{
/* ... */
};
/* ... */
class DN : public Base{
/* ... */
};
int main(){
/* je veux connaitre toues les objets qui héritent de base */
std::vector<std::unique_ptr<Base>> tab;
/* je vais rajouter des instances de D1 ... DN, mais je perd l'information de leur type réel */
tab.push_back(std::move(std::make_unique<D1>());
tab.push_back(std::move(std::make_unique</* ... */>());
tab.push_back(std::move(std::make_unique<DN>());
/* Je parcoure les objets que j'ai créés, mais je ne les connais que comme étant du type Base */
for(auto /* const */ & it : tab){
/* je peux utiliser les fonctions déclarées dans Base uniquement */
it.get()->foo()
}
} |