The const is a red herring here. You can have it, or not.

This is implementation detail leaking into the syntax.

If you have an abstract base class and you want to specify required protocol but don't happen to have a sensible default implementation in mind, you define a pure virtual function like this:

[code]
class F
{
public:
virtual void f() = 0;
};
[/code]

which essentially tells the compiler to put a null value into the vtable entry (array of function pointers used for dynamic dispatch) for this particular function at this level of abstraction. It also implies that this class is abstract and may not be instantiated because it is illegal to instance a class with a pure virtual function.