#include <iostream.h> class Object { public: Object (void) {} virtual void affiche(void) const ; } ; void Object::affiche(void) const { cout << "class Object" << endl ; } typedef Object *PtrObject ; class Pile { int ppile ; PtrObject tab[50] ; public: Pile(void) : ppile(0) {} void empiler(const PtrObject & po) { tab[ppile++]=po ; } PtrObject depiler(void) { return tab[--ppile] ; } } ; class SousObject : public Object { public: SousObject(void) {} virtual void affiche(void) const { cout << "class SousObject..." << endl ; } } ; int main(void) { Pile jEmpileTout ; SousObject so1,so2 ; Object o1,o2 ; jEmpileTout.empiler(&o1) ; jEmpileTout.empiler(&so1) ; jEmpileTout.empiler(&o2) ; jEmpileTout.empiler(&so2) ; for (int i=1; i<=4;i++) jEmpileTout.depiler()->affiche() ; return 0 ; }La généricité est bien implémentée mais impose au programmeur d'utiliser des pointeurs et de construire une hiérarchie de classes à partir d'une classe racine (non gérée automatiquement par le langage).