Concrete example for polymorphism use? I am preparing a lesson about polymorphism in C++ and I would like to give an original example other than animals and shapes and I am really struggling with it because I realize polymorphism is not that useful for real concrete applications.

Can someone suggest a good example of polymorphism use?
Say you want to present a choice of interactive games 

   out.println("Which game (...) ?");
   Game game;
   switch (in.nextLine()) {
   case "HI-LO" : 
         game = new HighLowGame();
         break;
   case "Riddle" : 
         game = new RiddleGame();
         break;
        ...
   }


Here you are. You have polymorphism. The game variable may refer to objects of different types.

Now, how to play a game (in textual form) ?

     out.println(game.getPresentation());
     while(! game.isOver()) {
         out.println(game.getQuestion());
         out.print("&gt; ");
         game.submitAnswer(in.nextLine());
         out.println(game.getMessage());
     }


Polymorphic code. Now what is in a Game?

    interface Game {
        String  getPresentation();
        boolean isOver();
        String getQuestion();
        void submitAnswer(String line);
        String getMessage();
    }


An implementation ?

class RiddleGame implements Game {
    String getPresentation() {
         return "What cheese is made backwards?";
    }
    String getQuestion() {
         return "Guess it!";
    }
    boolean found = false;
    void submitAnswer(String line) {
        found = line.trim().equals("edam");
    }
    boolean isOver() {
        return found;
    }
    String getMessage() {
        return found ? "you got it:" : "no, it isnt";
    }
}


Boring java details omitted.

[rant] 
Most introductory examples for OOP are utterly silly and totally inadequate to explain that classes are here to offer services. This unfortunate fact leads them to a lot of misconceptions.
[/rant]

The purpose of OOP is NOT to build taxonomies of animals, or make container objects with a getter and a setter for each attribute. It is not to model even a simplified view of the real world. It is there to write code which does something.

Oh, well, I see you don't like the RiddeGame because it knows only one joke.  So introduce a RiddleProvider as a parameter, whose job is to supply a Riddle  (question + answer pair).

You can imagine several kinds of RiddleProviders, so it is itself an interface with different implementations.

The simplest is the AlwaysTheSameRiddleProvider, which only know one joke, just like me. Others can run a predefined sequence, or a random choice, from an array, or from a file. Again, they offer a service to be used by another object.