Q:

When to mark a function in C++ as a virtual?

Because of C++ nature of static-binding for methods, this affects the polymorphic calls.
From Wikipedia:

Although the overhead involved in this dispatch mechanism is low, it
  may still be significant for some application areas that the language
  was designed to target. For this reason, Bjarne Stroustrup, the
  designer of C++, elected to make dynamic dispatch optional and
  non-default. Only functions declared with the virtual keyword will be
  dispatched based on the runtime type of the object; other functions
  will be dispatched based on the object's static type.

So the code:
Polygon* p = new Triangle;
p->area();

provided that area() is a non-virtual function in Parent class that is overridden in the Child class, the code above will call the Parent's class method which might not be expected by the developer. (thanks to the static-binding I've introduced)
So, If I want to write a class to be used by others (e.g library), should I make all my functions to be virtual for the such previous code to run as expected?

A:

The simple answer is if you intend functions of your class to be overridden for runtime polymorphism you should mark them as virtual, and not if you don't intend so.
Don't mark your functions virtual just because you feel it imparts additional flexibility, rather think of your design and purpose of exposing an interface. For ex: If your class is not  designed to be inherited then making your member functions virtual will be misleading. A good example of this is Standard Library containers,which are not meant to be inherited and hence they do not have virtual destructors.
There are n no of reasons why not to mark all your member functions virtual, to quote some performance penalties, non-POD class type and so on, but if you really intent that your class is intended for run time overidding then that is the purpose of it and its about and over the so-called deficiencies.

A:

Mark it virtual if derived classes should be able to override that method. It's as simple as that.

